您现在的位置是:网站首页> 开发积累
演练项目技术收集
- 开发积累
- 2024-07-20
- 968人已阅读
演练项目技术收集
模拟压电陶瓷振动传感器(检测是否有动)
无线wifi网络rtmp推流摄像头农场工地gb28181监控直播多人
灌溉系统所用硬件
另一款
压力传感器输出的是标准信号4~20mADC,这个信号是怎样转换成压力值的?在哪里转换的?
首先,这个4~20mA电流要通过一只高精密电阻转换成电压信号。这个电阻可能你的二次仪表中已经有了,也可能需要你自己连接。例如,在4~20mA回路中传入一只250欧的电阻,就可以把电流转换成1~5v的电压。
资料网盘下载:https://pan.baidu.com/s/1PIdrVOh2WoYYsMYs5F3chQ
一、功能特点:
产品尺寸:50*26*15mm
螺旋桨直径:75mm
工作电压:5V
L9110驱动,可控制正反转配有安装孔,兼容舵机舵盘控制优质螺旋桨,效率高。可轻松吹灭20cm外的打火机火焰可用于救火机器人的制作,机器人设计开发必备
二、模块功能测试
硬件要求
Arduino控制器 × 1
USB数据线 × 1
9110风扇模块 × 1
模块与Arduino板连接:
模块的VCC接5V, GND接GND,INA接数字接口9,INB接数字接口8 ,如下图所示:
说明:
系列:位置传感器-角度,线性位置测量
系列:SV01
用于测量:旋转位置
旋转角-电气,机械:0°-333.3°,连续
输出:模拟电压输出
执行器类型:轴孔的
线性度:±2%
电阻(Ohms):10k
电阻公差:±30%
安装类型:表面安装
端接样式:SMD(SMT) 接线片
工作温度:-40°C-85°C
模拟压电 陶瓷震动传感器 振动传感器 电子积木
性能描述:
1. 工作电压 :3.3V或5V
2. 工作电流 :<1mA
3. 工作温度范围:-10℃~+70℃
4. 接口类型:模拟信号输出
5. 尺寸大小:30mm x 23mm
6. 重量大小:5g
7.引脚定义:S信号输出、+电源(VCC)、-地(GND)
8.Input:压电陶瓷片的正极
9.Gnd:压电陶瓷片的负极
S端口接到控制器的模拟输入脚。5V 和GND分别接到电源的+5V和GND。Input和Gnd购买时连接好压电陶瓷片的正负极。
E22-230T22S:https://www.ebyte.com/product-view-news.html?id=464&=ds-tm
E22-230T30S:https://www.ebyte.com/product-view-news.html?id=482&=ds-tm
E22-230T22D:https://www.ebyte.com/product-view-news.html?id=1735&=ds-tm
E22-230T30D:https://www.ebyte.com/product-view-news.html?id=1736&=ds-tm
E22-400T22S:https://www.ebyte.com/product-view-news.html?id=1583&=ds-tm
E22-400T30S:https://www.ebyte.com/product-view-news.html?id=1585&=ds-tm
E22-400T33S:https://www.ebyte.com/product-view-news.html?id=1885&=ds-tm
E22-400T22D:https://www.ebyte.com/product-view-news.html?id=1582&=ds-tm
E22-400T30D:https://www.ebyte.com/product-view-news.html?id=1584&=ds-tm
E22-400T33D:https://www.ebyte.com/product-view-news.html?id=1769&=ds-tm
E22-900T22S:https://www.ebyte.com/product-view-news.html?id=1587&=ds-tm
E22-900T30S:https://www.ebyte.com/product-view-news.html?id=1589&=ds-tm
E22-900T22D:https://www.ebyte.com/product-view-news.html?id=1586&=ds-tm
E22-900T30D:https://www.ebyte.com/product-view-news.html?id=1588&=ds-tm
E22-230TBL-01:https://www.ebyte.com/product-view-news.html?id=632&=ds-tm
E22-230TBH-01:https://www.ebyte.com/product-view-news.html?id=631&=ds-tm
E22-400TBL-01:https://www.ebyte.com/product-view-news.html?id=634&=ds-tm
E22-400TBH-01:https://www.ebyte.com/product-view-news.html?id=633&=ds-tm
E22-900TBL-01:https://www.ebyte.com/product-view-news.html?id=636&=ds-tm
E22-900TBH-01:https://www.ebyte.com/product-view-news.html?id=635&=ds-tm
电平转换器
是一个电压转换装置,电平转换分为单向转换和双向转换,还有单电源和双电源转换,双电源转换采用双轨方案具有满足各方面性能的要求
四路 3.3V-5V 5V-3.3V IIC UART SPI TTL双向电平转换模块
【MK000809】
微型电动球阀
微型电动球阀 不锈钢304 电动二通阀 双向水控阀A/DC9-24V AC220V
- 连接方式: 内螺纹
无线wifi网络rtmp推流摄像头农场工地gb28181监控直播多人
数字渔业管理
4G无线通讯超高频RFID读写器FU-M6-M-4G
FU-M6-M-4G 可支持内置 5000mAh 锂电池,连续工作时长可达 2 小时以上,同时支持 DC5V 电源供 电。 FU-M6-M-4G 支持 TCP、UDP、MQTT、直接与远程服务器进行数据交互,通过指令控制读写器工 作。也可将读写器配置成客户端模式,主动上传读取到的数据到远程服务器,远程服务器即可对回传的 数据做处理。
智能柜相关资料
智能柜控制板
轻触开关超薄贴片4脚电路板薄膜按键小型微动电子按钮2锅仔片触摸
IO扩展
I2C接口16路IO扩展模块 IIC输入输出扩展板MCP23017-E/SS
控制板系统快递柜锁控板智能售货机主板储物寄存柜IC指纹人脸系统
快递柜锁电子锁智能电控锁员工储物柜锁存包柜锁柜门锁信报箱锁
36路锁控板无人售货机锁控板格子柜取餐锁控板智能快递柜锁控板
3.5寸HMI电容触摸屏 UTF-8 带铁框 带字库 组态屏 串口屏 液晶屏
电容式触摸 带字库 带铁框
智能锁柜
一、电控锁系统柜锁快递柜锁超市柜锁自取柜锁扫描锁蜂巢柜锁机械锁
锁控板485锁控板快递柜寄存柜储物柜控制板主板支持批量定制
二、薄膜键盘
Arduino 4×4薄膜键盘按键扫描程序原理
下图左是一款常见的薄膜按键模块(hex keypad),有4×4或3×4(少了最右边一行的A,B,C,D键),它的内部如同下图右边的电路所示,是由16个按键(开关)交织而成。有些按键模块直接使用按键(微触)开关组装,连接电路与程序都和本文相同。
4×4按键模块有8个接脚,分成列、行两组,可以接在Arduino的任意8个接脚,笔者将它接在数位6~13脚:
为了简化接线,可以使用「长脚型」排针,将其中两个脚用尖嘴钳稍微折弯,即可插入Arduino的排母:
排针上头的黑色塑料,可以用蛮力让它移到中间的位置,以便衔接两边的排母:
4×4薄膜键盘的Arduino按键侦测程序
撰写Arduino按键侦测程序,最简单也是最好的方式,就是采用既有的程序库。本单元将示范使用Keypad程序库,把侦测到的按键字元显示在序列端口监控视窗。请按此下载Keypad程序库(原始出处在这篇keypad介绍文),解压缩之后,置入Arduino的libraries路径:
底下的程序,修改自Keypad程序库的“HelloKeypad”示例,使用此程序库,我们的代码需要定义按键模块的行(col)、列(row)数、连接Arduino的脚位以及按键所代表的字元
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <Keypad.h> // 引用Keypad程式庫 #define KEY_ROWS 4 // 按鍵模組的列數 #define KEY_COLS 4 // 按鍵模組的行數 // 依照行、列排列的按鍵字元(二維陣列) char keymap[KEY_ROWS][KEY_COLS] = { { '1' , '2' , '3' , 'A' }, { '4' , '5' , '6' , 'B' }, { '7' , '8' , '9' , 'C' }, { '*' , '0' , '#' , 'D' } }; byte colPins[KEY_COLS] = {9, 8, 7, 6}; // 按鍵模組,行1~4接腳。 byte rowPins[KEY_ROWS] = {13, 12, 11, 10}; // 按鍵模組,列1~4接腳。 // 初始化Keypad物件 // 語法:Keypad(makeKeymap(按鍵字元的二維陣列), 模組列接腳, 模組行接腳, 模組列數, 模組行數) Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, KEY_ROWS, KEY_COLS); void setup(){ Serial.begin(9600); } void loop(){ // 透過Keypad物件的getKey()方法讀取按鍵的字元 char key = myKeypad.getKey(); if (key){ // 若有按鍵被按下… Serial.println(key); // 顯示按鍵的字元 } } |
编译并上传代码,再开启「序列监控视窗」,按下薄膜键盘的任何按键,该字元将显示在序列端口监控视窗。
按键侦测与扫描原理
为了方便解说,笔者把4×4按键简化成3×1,像下图这样串连三个开关,连接到同一个微控制器的输入脚。此外,因为要简化开关电路,所以要启用微控器内部的上拉电阻:
假设开关的「行1」~「行3」输入端全都输入高电位,无论开关是否被按下,Arduino将接收到高电位(1)。为了检测到其中按键被按下,程序必须依序将「行1」~「行3」脚位设定成低电位。
轮到「行2」脚输入低电位,此时,微控器的输入脚也将接收到低电位(0),由此可知连接「行2」的「开关B」被按下了
轮到「行3」脚输入低电位,由于「开关C」未被按下,因此微控器的输入脚接收到高电位(1)。
到此,侦测按键的程序必须再次回到「行1」,输入低电位…如此反复循环扫描,才能持续侦测到某个按键是否被按下。实际的程序需要运用双重循环,才能分批扫描每一列:
双重循环的练习,请参阅《超图解Arduino互动设计入门》第8章「LED矩阵动画与多维数组程序设计」一节,8-28页
自行撰写扫描按键的程序
根据以上说明,自行撰写扫描按键的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | const byte colPins[4] = {9, 8, 7, 6}; // 設定「行」腳位 const byte rowPins[4] = {13, 12, 11, 10}; // 設定「列」腳位 const char keymap[4][4] = { // 設定按鍵的「行、列」代表值 { '1' , '2' , '3' , 'A' }, { '4' , '5' , '6' , 'B' }, { '7' , '8' , '9' , 'C' }, { '*' , '0' , '#' , 'D' } }; byte i, j; // 暫存迴圈的索引數字 byte scanVal; // 暫存掃描到的按鍵值 void setup(){ Serial.begin(9600); for (i = 0; i < = 3; i++) { pinMode(rowPins[i], INPUT); pinMode(colPins[i], OUTPUT); digitalWrite(colPins[i], HIGH); digitalWrite(rowPins[i], HIGH); } } void loop() { for (i = 0; i <= 3; i++) { for (j = 0; j <= 3; j++) { digitalWrite(colPins[j], LOW); scanVal = digitalRead(rowPins[i]); if (scanVal == LOW) { // 如果輸入值是「低電位」… Serial.println(keymap[i][j]); // 輸出按鍵代表的字元 delay(200); // 掃描按鍵的間隔時間 digitalWrite(colPins[j], HIGH); break ; // 跳出迴圈 } digitalWrite(colPins[j], HIGH); } } } |
Keypad程序库的运作方式大致上面的程序相同,主要是多了消除弹跳(debounce)的程序(相关说明请参阅第四章「解决开关信号的弹跳问题」一节,4-15页),而且按键扫描的间隔时间是透过比对时间差,而非使用delay。上面的程序用于帮助理解扫描按键的原理,在实际项目制作上,请使用Keypad程序库。
三、双输出开关电源正负5V12V24V双组15V电压两组路D-30/50/60/75/360
四、单节18650锂电池3.7v升压模块转5V9V12Vl24V输入放电充电一体4.2V
五、12V蓄电池防过放防过压控制模块欠压自动充电锂电池电瓶保护器板
链接:https://pan.baidu.com/s/1Asl0Q7TxySrJMRUNr4Xnag 提取码:jo4x
arduino 写字机器人制作教程
经过重新建模,
已经更新了写字机器人2.0点击前往详细制作教程。
写字机器人2.0点击前往详细制作教程。
(班门弄斧,请各位大神批评指正,烦请提出宝贵意见。)
第一次写,新手勿喷(有用能不能点个赞,花时间整理的,给点鼓励)
以下全是自己做过的,材料配件(3d打印除外)花了200多块上下,上位机买的花了100多一点。
先上个自己做的成品图
下面是配件表
arduino UNO 1块
CNC shield v3雕刻机扩展板
1片
A4988驱动芯片(带散热片) 3片
12V 3A监控电源 1个
SG90 舵机1个
42步进电机 2个
短接帽9个
M3 8mm 螺丝 2个
M3 20mm 螺丝10个
M3 30mm 螺丝8个
M3螺帽 22个
M10螺帽 8个
直线光轴8mm400mm 2根
直线光轴8mm300mm 2根
直线光轴6mm*100mm 2根
LM6UU直线轴承 2个
LM8UU直线轴承 8个
2GT-16齿同步轮 内孔5mm 含顶丝 2个
16齿同步轮 被动轮 内孔3mm 1个
16齿 无齿轮 被动轮 内孔3mm 4个
2GT同步带 带宽6mm 2米
3d打印件我用的是这个
里面笔架可能不太好用,然后自己直接把舵机直接溶胶枪粘在笔上了,在文章尾部会给个图。
3D打印的零件包:https://download.csdn.net/download/jun8086/11029406
按照图片把架子组装起来
按照这个装同步带
控制原理:绿色箭头表示笔架的运动方向,红色表示同步带的运动方向。
这个笔架比较鸡肋我这样弄的
都安装好了后,连上电脑,打开arduinoADE,导入grbl库,下一个微雕管家,或者奎享雕刻,连上测试。再好好设置一下参数就ok了。
注意:
1.控制笔上下的接线:
舵机的三根线接在图示三个位置。
方案二:
arduino UNO 1块
CNC shield v3雕刻机扩展板 1片
A4988驱动芯片(带散热片) 2片 (可以买4片备用,插反了会烧)
12V 3A监控电源 1个
SG90 舵机1个
42步进电机 2个
短接帽9个
(2)线性杆M8 x 450mm,X轴
(2)线性杆M8 x 350mm,Y轴
(2)线性杆3毫米,Z轴(CDROM)
(1)螺纹杆M8 X470毫米
(8)LM8UU轴承或印刷
(1)伺服Sg90
(1)弹簧连杆
(2)GT2皮带轮,16个齿
(5)轴承624zz
2000毫米GT2带
螺母:
(7)M3-0.5
(5)M4-0.7
(4)5/16英寸18
螺钉
(13)十字M3-0.5 x 16mm
(4)十字M3-0.5 x 6mm
(5 )Phillips M4-0.7x 35mm
(1)六角M3-0.5 x 20mm
垫圈
(4)5/16英寸垫圈
(4)M3垫圈
装配过程:(网上下的图)
3D打印零件包:
https://download.csdn.net/download/jun8086/11949631
组装好后,IDE烧库文件。上位机连接,发送gcode 就能写了。
第一次写,有些凌乱,自己开始没找到方案二的所以,做出来了第一个图片中的那个,个人觉得方案2更好一些,特别是3D打印的零件。
部分图片来源于网络,侵删!
欢迎大家批评指正。
有其它疑问请关注公众号“电子玩家营地”
在这上边消息容易回复些。
3D打印文件回复“ 3D打印文件”
库文件回复“库文件 ”
GRBL相关资料
grbl
这些就是grbl回传的参数了,里面涵盖了所需要修改的参数,而且修改参数的方法也很简单,只需要输入$相应的序号=val,如修改xyz轴的行进一毫米的脉冲数可以输入$100=所需脉冲数(修改x轴),$101=所需脉冲数(修改y轴),$102=所需脉冲数(修改z轴),但是使各轴运动反向不是那么简单,因为grbl是根据设置掩码来反向电机的,所以需要查看源码,
根据这段代码可以看出xyz轴分别设置为第一第二第三启动,所以在设置相应轴电机运动反向可以通过将相应位置的掩码置位(根据二进制计算)就可以了,比如设置x轴反向$3=1(等效$3=00000001),设置xy轴电机反向输入$3=3(等效$3=00000011)即可!
lasterGrbl和GRBL使用指南
原文
0. 目录:
- 首页:https://github.com/gnea/grbl/wiki
- 编译Grbl:https://github.com/gnea/grbl/wiki/Compiling-Grbl
- 连接Grbl:https://github.com/gnea/grbl/wiki/Connecting-Grbl
- 将Grbl上传到Arduino:https://github.com/gnea/grbl/wiki/Flashing-Grbl-to-an-Arduino
- 经常问的问题
- grbl v1.1
- Grbl v1.1命令
- Grbl v1.1配置
- Grbl v1.1接口
- Grbl v1.1Jogging
- Grbl v1.1激光模式
- 如何控制数控等离子切割机的发射
- 已知的问题
- 设置归位周期
- 使用Grbl
- 接线限位开关
GRBL设置
- 更改绘图仪设置
参数 | 说明 |
---|---|
$0=10 | (steppulse, usec) 步进脉冲时间,建议10us |
$1=25 | (step idle delay, msec) 步进电机除能延迟时间 |
$2=0 | (stepport invert mask:00000000) 步进电机驱动端口有效位掩码 |
$3=6 | (dirport invert mask:00000110) 步进电机驱动方向位掩码 |
$4=0 | (stepenable invert, bool) 步进电机使能取反有效位设置 |
$5=0 | (limit pins invert, bool) 限位IO口取反有效位设置 |
$6=0 | (probe pin invert, bool) 探针IO口取反有效位设置 |
$10=3 | (status report mask:00000011) 状态报告掩码 |
$11=0.020 | (junction deviation, mm) 节点偏差 |
$12=0.002 | (arc tolerance, mm) 圆弧公差 |
$13=0 | (report inches, bool) 位置坐标的单位设置 |
$20=0 | (soft limits, bool) 软限位开关 |
$21=0 | (hard limits, bool) 硬限位开关 |
$22=0 | (homing cycle, bool) 归位使能位 |
$23=1 | (homing dir invert mask:00000001) 归位方向位掩码 |
$24=50.000 | (homing feed, mm/min) 归位进给速率 |
$25=635.000 | (homing seek, mm/min) 归位快速速率 |
$26=250 | (homing debounce, msec) 归位边界反弹时间 |
$27=1.000 | (homing pull-off, mm) 归位点坐标离限位器触发点的距离 |
$100=314.961 | (x, step/mm) x轴速度转化参数 步/毫米 |
$101=314.961 | (y, step/mm) y轴速度转化参数 步/毫米 |
$102=314.961 | (z, step/mm) z轴速度转化参数 步/毫米 |
$110=635.000 | (x max rate, mm/min) x轴最大速率 毫米/分钟 |
$111=635.000 | (y max rate, mm/min) y轴最大速率 毫米/分钟 |
$112=635.000 | (z max rate, mm/min) z轴最大速率 毫米/分钟 |
$120=50.000 | (x accel, mm/sec2) x轴加速度 毫米/(s2) |
$121=50.000 | (y accel, mm/sec2) y轴加速度 毫米/(s2) |
$122=50.000 | (z accel, mm/sec2) z轴加速度 毫米/(s2) |
$130=225.000 | (x max travel, mm) x轴最大行程 |
$131=125.000 | (y max travel, mm) y轴最大行程 |
$132=170.000 | (z max travel, mm) z轴最大行程 |
GRBL官方配置文件
Grbl v1.1配置
1. 入门
1. Grbl设置
$$-查看Grbl设置
设置和样本值 | 描述 |
---|---|
$ 0 = 10 | 步进脉冲,微秒 |
$ 1 = 25 | 步进闲置延迟 |
$ 2 = 0 | 步进端口反转,屏蔽 |
$ 3 = 0 | 方向端口反转,屏蔽 |
$ 4 = 0 | 逐步启用反转,布尔 |
$ 5 = 0 | 限位销反转,布尔 |
$ 6 = 0 | 探针取反,布尔 |
$ 10 = 1 | 状态报告,掩码 |
$ 11 = 0.010 | 结点偏差,mm |
$ 12 = 0.002 | 电弧公差,mm |
$ 13 = 0 | 报告英寸,布尔值 |
$ 20 = 0 | 软限制,布尔值 |
$ 21 = 0 | 硬限制,布尔值 |
$ 22 = 1 | 归位周期,布尔 |
$ 23 = 0 | 归位目录反转,掩码 |
$ 24 = 25.000 | 归位进给,mm / min |
$ 25 = 500.000 | 归位,mm / min |
$ 26 = 250 | 归位反跳,毫秒 |
$ 27 = 1.000 | 归位拉脱,mm |
$ 30 = 1000. | 最高主轴转速,RPM |
$ 31 = 0. | 最小主轴转速,RPM |
$ 32 = 0 | 激光模式,布尔 |
$ 100 = 250.000 | X步/毫米 |
$ 101 = 250.000 | Y步/毫米 |
$ 102 = 250.000 | Z步/毫米 |
$ 110 = 500.000 | X最大速率,毫米/分钟 |
$ 111 = 500.000 | Y最大速率,mm / min |
$ 112 = 500.000 | Z最大速率,mm / min |
$ 120 = 10.000 | X加速度,mm / sec 2 |
$ 121 = 10.000 | Y加速度,mm / sec 2 |
$ 122 = 10.000 | Z加速度,mm / sec2 |
$ 130 = 200.000 | X最大行程,毫米 |
$ 131 = 200.000 | Y最大行程,mm |
$ 132 = 200.000 | Z最大行程,mm |
$ x = val-保存Grbl设置
2. Grbl的$x=val
设置及其含义
$ 0 –步进脉冲,微秒
$ 1-步空闲延迟,毫秒
$ 2 –步骤端口反转,掩码
设定值 | 掩码 | 反转X | 反转Y | 反转Z |
---|---|---|---|---|
0 | 00000000 | ? | ? | ? |
1 | 00000001 | ? | ? | ? |
2 | 00000010 | ? | ? | ? |
3 | 00000011 | ? | ? | ? |
4 | 00000100 | ? | ? | ? |
5 | 00000101 | ? | ? | ? |
6 | 00000110 | ? | ? | ? |
7 | 00000111 | ? | ? | ? |
$ 3 –方向端口反转,掩码
$ 4-步启用反转,布尔
$ 5-限制引脚反转,布尔
$ 6-探针反相,布尔
$ 10-状态报告,遮罩
报告类型 | 值 | 描述 |
---|---|---|
职位类型 | 0 | 启用WPos: 禁用MPos: 。 |
职位类型 | 1 | 启用MPos: 。禁用WPos: 。 |
缓冲数据 | 2 | Buf:出现“已启用” 字段,其中包含计划程序和串行RX可用缓冲区。 |
$ 11-接线端偏差,mm
$ 12 –电弧公差,毫米
$ 13-报告英寸,布尔值
$ 20-软限制,布尔值
$ 21-硬限制,布尔值
$ 22-归位周期,布尔
$ 23-归位方向反转,遮罩
$ 24-归位进给,mm / min
$ 25-归位搜索,毫米/分钟
$ 26-归位反跳,毫秒
$ 27-归位拉脱,毫米
$ 30-主轴spindle最高转速,RPM
$ 31-主轴最低转速,RPM
$ 32-激光模式,布尔
$ 100,$ 101和$ 102 – [X,Y,Z]步/毫米
$ 110,$ 111和$ 112 – [X,Y,Z]最大费率,mm / min
$ 120,$ 121,$ 122 – [X,Y,Z]加速度,毫米/秒^ 2
$ 130,$ 131,$ 132 – [X,Y,Z]最大行程,毫米
3. 首次设置机器的快速指南
- 确保按照步进驱动器制造商指南正确连接和供电。
- 如果您的步进器已经安装在CNC中,请确保您的轴可以自由移动并且不会明显束缚。如果您无法轻松分辨,请尝试卸下步进电机,并检查它们是否在无负载的情况下运行。
- 确保步进电机和轴的线性机构都牢固牢固。传动系统组件上的小紧定螺钉变松是一个非常普遍的问题。重新拧紧并尝试使用一些永久性的螺纹储物柜(乐泰蓝),如果它持续松动。
- 对于更困难的问题,请尝试消除过程以快速隔离问题。首先断开所有与Arduino的连接。测试Grbl本身是否运行正常。然后,一次添加一件事并进行测试。
- 如果您的步进电机通电并且在尝试移动时发出磨擦声,请尝试降低“ $”加速度和最大速率设置。这种声音表明您的步进器正在失去步伐,并且由于扭矩负载过大或过快而无法跟上。
- Grbl的默认步进脉冲设置涵盖了市场上绝大多数的步进驱动器。虽然很不常见,但如果您仍然遇到问题或设置不正常,请检查这些设置。
接下来,您将需要确保您的机器根据笛卡尔(XYZ)坐标系朝正确的方向移动,并满足右手规则,如下所示:
激光开/关(M3 / M5)不起作用?
GRBL的PWM功能–如何控制激光或变速主轴。
GRBL串口控制命令及代码解析
单片机串口跟电脑连接,测试GRBL串口命令
1.输入:“$”显示如下:
$$(view Grbl settings) //命令“$$”查看GRBL设置
$x=value (save Grbl setting) //保存设置
$H (run homing cycle)//返回原点
? (current status)//显示当前坐标
ctrl-x (reset Grbl)//复位
2.输入:“$$”显示如下
$0=400.000000 (x, step/mm)//X轴每毫米多少步设置,计算得到:(一圈多少步*驱动倍频数)/电机转一圈前进多少
// 毫米
$1=400.000000 (y, step/mm)
$2=250.000000 (z, step/mm)
$3=10 (step pulse, usec)一个周期中低电平的拉低时间,设置第二个定时器定时时间的
$4=400.000000 (default feed, mm/min)//G0使用,快速从A点到B点,值越大速度越大
$5=500.000000 (default seek, mm/min)//G1 G1 G3使用,G代码中未设置进给速度时使用,eg:平时
//G01x10y10f500时候500就是进给速度,如果不指定时候就用这个
$6=33092 (step port invert mask, int:0x8144)//XYZ step direction引脚bit设置
$7=25 (step idle delay, msec)
$8=500.000000 (acceleration, mm/sec^2)//加减速大小,数值越大加减速时间越小
$9=0.050000 (junction deviation, mm)
$10=0.100000 (arc, mm/segment)//角速度
$11=25 (n-arc correction, int)
$12=3 (n-decimals, int)
$13=0 (report inches, bool)
$14=1 (auto start, bool)//自启动设置位
$15=0 (invert step enable, bool)
$16=0 (hard limits, bool)
$17=0 (homing cycle, bool)//与回原点有关的
$18=0 (homing dir invert mask, int:0)0
$19=25.000000 (homing feed, mm/min)
$20=250.000000 (homing seek, mm/min)
$21=100 (homing debounce, msec)
$22=1.000000 (homing pull-off, mm)
ok
不仅可以显示当前设置参数,还可以修改参数例:输入:“$0=500”会显示OK,再输入"$$"查看参数发现已修改
修改后会自动保存到EEPROM,可以修改每个参数的值
3.输入:“?”显示当前位置如下
4.输入G代码:
eg:"G00X10Y10" 快速移动到(10,10),进给速度用的default中的$4,注意(10,10)是绝对时间
如果当前位置为(10,10),再输入G00X10Y10将不移动,因为现在就在这个位置处
eg: "G00X10Y10F2000" 直线差补,进给速度为2000mm/min
自动灌溉
自动灌溉硬件
Heltec Arduino ASR6501 lora开发板SX1262太阳能 物联网LoRaWAN
兼容Arduino开发板LoRa无线传感器ASR6502 LoRaWAN电池仓接口丰富
Modbus继电器IO模块宽电压控制器遥控开关量采集 485串口继电器
arduino nano/uno主板seeeduino XIAO开发板arm微控制器miniSeeed
大功率MOS管 场效应管 触发开关驱动模块 PWM调节电子开关控制板
电动伸缩杆
电磁铁推拉杆式长行程35mm 微型直流12v24v220V力5kg牵引电磁门锁
水流量传感器
水流速传感器
继电器
公共端COM NC 常闭 NO常开
设备负极接COM
正极接NC 常闭表示一直供电,信号来后断开
arduino的IO口驱动大功率设备的新选择,MOS驱动器
设计这款驱动器的想法由来已久,很多时候缺少一个可靠好用的arduino的IO口功率放大器,一般要用的时候,能用固态继电器搞定的用固态继电器(不计成本),或者洞洞板搭一个三极管扩流电路,甚至不择手段的用上了电机驱动板。
反正各种的不方便,so。。。痛苦纠结了N久,设计了一款扩流板电路,就是下图展示的这款(这款已经是成熟的第三代了)
这款板子充分考虑到了实际使用中驱动1W-50W功率范围内的直流设备,比如灯泡,水泵 led灯条等,需要功率,同时可能需要pwm控制的器件,并且充分考虑其成本。以及安全性。
so,就如上图所示,灯条轻松跑呼吸灯,提供四个独立的通道~~~
Arduino Pro Mini
lora基本参数
速率(0.3 1.2 2.4 4.8 9.6 19.2 ..)
地址 0-65543
信道 0-31 共32个信道
1、lora是半双工的产品,不支持同时读写, 不能同时进行数据收发 ,且主机无法在同一时刻接收多个从机上报的数据
2、 LoRa 数传终端是半双工的通讯方式(类似于有线的 485),同一时刻在同一通道内只支持一个设备进 行发送操作,不支持多个从站设备同时向主站设备发送数据;
3、LoRa 通信方式空中耗时较长,不适合应用于对实时性要求较高的场景。
4、使用 LoRa 速率越低,则传输距离越远,抗干扰能力越强,发送数据耗时越长。
在串口调试助手的接收窗口收到一组数据:
UART:B"9600",D"0",S"0",C"0".LORA:CHN"4",FRE"500",POW"17",BW"62",SF"11",CR"2",CRC"1".
数据各参数意思分别是:B:波特率;D:数据位;S:停止位;C:校验位。CHN:4,默认使用4信道,后面是LoRa在4信道时的参数。FRE:频率;POW:发射功率;BW:带宽;SF:扩频因子;CR:编码率;CRC:校验。
AT指令 | 正确返回值 | 指令说明 |
---|---|---|
AT+MODE+SEND | MODE SEND | 设置为发送模式 |
AT+MODE+RECV | MODE RECV | 设置为接收模式 |
接下来我们更改设备A的LoRa参数,再看设备B还能否收到数据。在更改设备参数时,需要先将设备从当前状态退出到指令模式再进行更改,相关操作指令如下:
AT指令 正确返回值 指令说明
+++ QUIT MODE SEND! 发送模式退出到指令模式
AT+LORA+FRE=“490” LORA:CHN"0",FRE"490",POW"17",
BW"62",SF"11",CR"2",CRC"1". 设置LoRa发送频率
AT+LORA+SET Reset LoRa… 使能当前LoRa配置
AT+LORA+GET LORA:CHN"0",FRE"490",POW"17",
BW"62",SF"11",CR"2",CRC"1". 获取LoRa配置参数
AT+MODE+SEND MODE SEND 设置为发送模式
第一步:发送设备A更改发送频率为490MHz
发→AT+LORA+FRE=“490”
收←LORA:CHN"0",FRE"490",POW"17",BW"62",SF"11",CR"2",CRC"1".
第二步:使能LORA参数设置
发→AT+LORA+SET
收←Reset LoRa…
第三步:获取LORA参数
发→AT+LORA+GET
收←LORA:CHN"0",FRE"490",POW"17",BW"62",SF"11",CR"2",CRC"1".
这里有点需要注意的是:
第一步发送设置频率的AT指令后,返回的数据中有490,其实这个时候LoRa还没有变为490,还是初始值500,需要第二步使能之后才会变为490,LoRa其他参数更改时也需要这一步操作。
设备A改完发送频率后,再重新配置成发送模式,然后观察设备B是否还能收到数据。
发多少宽度的脉冲就是转对少多,为了保证转到位可多发几次这种脉冲
如
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
自动灌溉相关代码
存储代码
#include <EEPROM.h>
#include <avr/wdt.h>
int i=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.print("start\r\n");
//EEPROM.write(0,123);
i=EEPROM.read(0);
wdt_enable(WDTO_2S); //开启看门狗,并设置溢出时间为两秒
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print(i);
Serial.print("Length:");
Serial.print(EEPROM.length());
Serial.print("\r\n");
delay(3000);
}
控制电机终端等
#include "Arduino.h"
#include "heltec.h"
#define ServoPin 12
int nState=0;
long map(long x,long in_min,long in_max,long out_min,long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void ServoControl(int servoAngle)
{
double thisAngle = map(servoAngle, 0, 180, 500, 2500);//等比例角度值范围转换高电平持续时间范围
unsigned char i = 50;//50Hz 每秒的周期次数(周期/秒) 即1S 50 个周期 每个周期20ms
while (i--)
{
digitalWrite(ServoPin, HIGH);
delayMicroseconds(thisAngle); //高电平时间
digitalWrite(ServoPin, LOW);
delayMicroseconds(20000 - thisAngle);//每个周期20ms减去高电平持续时间
}
}
void setup() {
// put your setup code here, to run once:
Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/);
Heltec.display->flipScreenVertically();
Heltec.display->setFont(ArialMT_Plain_10);
pinMode(13, OUTPUT);
pinMode(36,INPUT_PULLUP);
//设置中断触发程序
attachInterrupt(digitalPinToInterrupt(36), LOOK, CHANGE);
pinMode(ServoPin, OUTPUT);
digitalWrite(ServoPin, LOW);//先保证拉低
}
void LOOK()
{
if(digitalRead(36)==HIGH)
{
digitalWrite(13, LOW);
{
nState=0;
}
}
else
{
digitalWrite(13, HIGH);
{
nState=1;
}
}
}
int A=0;
void loop2()
{
/*
for (int i = 0; i <= 180 ; i += 10)
{
//delay(500);
delay(5);
//Serial.println(i);
ServoControl(i);
}
*/
delay(5);
ServoControl(A);
A+=10;
if(A>180)
{
A=0;
}
if(nState==0)
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "close");
Heltec.display->display();
}
else
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "open");
Heltec.display->display();
}
}
void loop() {
loop2();
return;
// put your main code here, to run repeatedly:
digitalWrite(13, HIGH);
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "open");
Heltec.display->display();
}
delay(5000);
digitalWrite(13, LOW);
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "close");
Heltec.display->display();
}
delay(5000);
}
WIFI客户端web服务
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
const char *ssid = "YourSSIDHere";
const char *password = "YourPSKHere";
WebServer server(80);
const int led = 13;
void handleRoot() {
digitalWrite(led, 1);
char temp[400];
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
snprintf(temp, 400,
"<html>\
<head>\
<meta http-equiv='refresh' content='5'/>\
<title>ESP32 Demo</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>Hello from ESP32!</h1>\
<p>Uptime: %02d:%02d:%02d</p>\
<img src=\"/test.svg\" />\
</body>\
</html>",
hr, min % 60, sec % 60
);
server.send(200, "text/html", temp);
digitalWrite(led, 0);
}
void handleNotFound() {
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
void setup(void) {
pinMode(led, OUTPUT);
digitalWrite(led, 0);
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on("/test.svg", drawGraph);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
}
void drawGraph() {
String out = "";
char temp[100];
out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"400\" height=\"150\">\n";
out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n";
out += "<g stroke=\"black\">\n";
int y = rand() % 130;
for (int x = 10; x < 390; x += 10) {
int y2 = rand() % 130;
sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2);
out += temp;
y = y2;
}
out += "</g>\n</svg>\n";
server.send(200, "image/svg+xml", out);
}
WIFI热点Web服务
#include <Arduino.h>
#include "WiFi.h"
#include <WebServer.h>
#include <ESPmDNS.h>
WebServer server(80);
const int led = 13;
void handleRoot() {
digitalWrite(led, 1);
server.send(200, "text/plain", "hello from esp8266!");
digitalWrite(led, 0);
}
void handleNotFound() {
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
void setup()
{
Serial.begin(115200);
IPAddress localIP(192,168,7,1);
IPAddress gateway(192,168,7,0);
IPAddress subnet(255,255,255,0);
WiFi.softAP("ESP_AP", "12345678");
WiFi.setHostname("myHostname");
WiFi.softAPConfig( localIP, gateway, subnet);
server.on("/", handleRoot);
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop()
{
Serial.print("主机名:");
Serial.println(WiFi.softAPgetHostname());
Serial.print("主机IP:");
Serial.println(WiFi.softAPIP());
Serial.print("主机IPV6:");
Serial.println(WiFi.softAPIPv6());
Serial.print("主机SSID:");
Serial.println(WiFi.SSID());
Serial.print("主机广播IP:");
Serial.println(WiFi.softAPBroadcastIP());
Serial.print("主机mac地址:");
Serial.println(WiFi.softAPmacAddress());
Serial.print("主机连接个数:");
Serial.println(WiFi.softAPgetStationNum());
Serial.print("主机网络ID:");
Serial.println(WiFi.softAPNetworkID());
Serial.print("主机状态:");
Serial.println(WiFi.status());
server.handleClient();
delay(1000);
}
Arduino软重启
将12脚连接一个1K电阻,然后用电阻另一端连接RESET脚。注意不是12脚直接连接RESET!!
代码如下(要注意RESET脚为LOW时自动重启)
#define PIN 12
void setup(){
digitalWrite(PIN,HIGH);
pinMode(PIN,OUTPUT);
}
void reset(){
digitalWrite(PIN,LOW);
}
Http请求
/**
* BasicHTTPClient.ino
*
* Created on: 24.05.2015
*
*/
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#define USE_SERIAL Serial
WiFiMulti wifiMulti;
/*
const char* ca = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \
"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \
"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \
"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \
"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \
"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \
"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \
"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \
"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \
"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \
"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \
"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \
"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \
"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \
"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \
"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \
"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \
"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \
"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \
"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \
"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \
"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \
"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \
"-----END CERTIFICATE-----\n";
*/
void setup() {
USE_SERIAL.begin(115200);
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
USE_SERIAL.flush();
delay(1000);
}
//wifiMulti.addAP("SSID", "PASSWORD");
wifiMulti.addAP("userhome", "52410000");
}
void loop() {
// wait for WiFi connection
if((wifiMulti.run() == WL_CONNECTED)) {
HTTPClient http;
USE_SERIAL.print("[HTTP] begin...\n");
// configure traged server and url
//http.begin("https://www.howsmyssl.com/a/check", ca); //HTTPS
//http.begin("http://example.com/index.html"); //HTTP
http.begin("http://www.cupfox.com/"); //HTTP
USE_SERIAL.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if(httpCode > 0) {
// HTTP header has been send and Server response header has been handled
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
// file found at server
if(httpCode == HTTP_CODE_OK) {
String payload = http.getString();
USE_SERIAL.println(payload);
}
} else {
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
delay(5000);
}
板子按钮使用
#include "Arduino.h"
#include "heltec.h"
int nState=0;
void setup() {
// put your setup code here, to run once:
Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Disable*/, true /*Serial Enable*/);
Heltec.display->flipScreenVertically();
Heltec.display->setFont(ArialMT_Plain_10);
pinMode(13, OUTPUT);
pinMode(0,INPUT_PULLUP); //按钮在0号脚
//设置中断触发程序
attachInterrupt(digitalPinToInterrupt(0), LOOK, CHANGE);
// pinMode(ServoPin, OUTPUT);
// digitalWrite(ServoPin, LOW);//先保证拉低
}
void LOOK()
{
if(digitalRead(0)==HIGH)
{
digitalWrite(13, LOW);
{
nState=0;
}
}
else
{
digitalWrite(13, HIGH);
{
nState=1;
}
}
}
void loop2()
{
if(nState==0)
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "close");
Heltec.display->display();
}
else
{
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_10);
Heltec.display->drawString(0, 0, "open");
Heltec.display->display();
}
}
void loop() {
loop2();
return;
// put your main code here, to run repeatedly:
}
MQTT使用
/*
SimpleMQTTClient.ino
The purpose of this exemple is to illustrate a simple handling of MQTT and Wifi connection.
Once it connects successfully to a Wifi network and a MQTT broker, it subscribe to a topic and send a message to it.
It will also send a message delayed 5 seconds later.
*/
#include "EspMQTTClient.h"
/*
EspMQTTClient client(
"WifiSSID",
"WifiPassword",
"192.168.1.100", // MQTT Broker server ip
"MQTTUsername", // Can be omitted if not needed
"MQTTPassword", // Can be omitted if not needed
"TestClient", // Client name that uniquely identify your device
1883 // The MQTT port, default to 1883. this line can be omitted
);
*/
EspMQTTClient client(
"userhome",
"52410000",
"112.74.17.122", // MQTT Broker server ip
"MQTTUsername", // Can be omitted if not needed
"MQTTPassword", // Can be omitted if not needed
"TestClient", // Client name that uniquely identify your device
1883 // The MQTT port, default to 1883. this line can be omitted
);
void setup()
{
Serial.begin(115200);
// Optionnal functionnalities of EspMQTTClient :
client.enableDebuggingMessages(); // Enable debugging messages sent to serial output
client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password").
client.enableLastWillMessage("TestClient/lastwill", "I am going offline"); // You can activate the retain flag by setting the third parameter to true
}
// This function is called once everything is connected (Wifi and MQTT)
// WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient
void onConnectionEstablished()
{
// Subscribe to "mytopic/test" and display received message to Serial
client.subscribe("mytopic/test", [](const String & payload) {
Serial.println(payload);
});
// Subscribe to "mytopic/wildcardtest/#" and display received message to Serial
client.subscribe("mytopic/wildcardtest/#", [](const String & topic, const String & payload) {
Serial.println("(From wildcard) topic: " + topic + ", payload: " + payload);
});
// Publish a message to "mytopic/test"
client.publish("mytopic/test", "This is a message"); // You can activate the retain flag by setting the third parameter to true
// Execute delayed instructions
client.executeDelayed(5 * 1000, []() {
client.publish("mytopic/wildcardtest/test123", "This is a message sent 5 seconds later");
});
}
void loop()
{
client.loop();
}
MD5计算
#include <MD5.h>
/*
This is en example of how to use my MD5 library. It provides two
easy-to-use methods, one for generating the MD5 hash, and the second
one to generate the hex encoding of the hash, which is frequently used.
*/
void setup()
{
//initialize serial
Serial.begin(9600);
//give it a second
delay(1000);
//generate the MD5 hash for our string
unsigned char* hash=MD5::make_hash("hello world");
//generate the digest (hex encoding) of our hash
char *md5str = MD5::make_digest(hash, 16);
//print it on our serial monitor
Serial.println(md5str);
}
void loop()
{
}
JSON使用
#include <ArduinoJson.h>
DynamicJsonDocument doc(1024);
deserializeJson(doc,"{}");
JsonObject obj = doc.as<JsonObject>();
if(iOK==0)
{
obj["bOK"] = false;
obj["sMsg"]=message;
String output;
serializeJson(doc, output);
Serial.println(output);
server.send(200, "text/plain", output);
Serial.println(message);
digitalWrite(led, 0);
}
else
{
obj["bOK"] = true;
obj["sMsg"]="Config OK!";
String output;
serializeJson(doc, output);
server.send(200, "text/plain", output);
Serial.println(message);
digitalWrite(led, 0);
resetFunc(); //重启程序开始
}
上一篇:开发相关软件使用
下一篇:硬件研发技术及实操收集