您现在的位置是:网站首页> 开发积累

演练项目技术收集

摘要

演练项目技术收集


灌溉系统所用硬件

水压传感器

旋转角度传感器微调电位器

一般直流电机驱动板

转动角度传感器

模拟压电陶瓷振动传感器(检测是否有动)

LORA传输模块

电平转换3.3V 5V 互转

微型电动球阀

无线wifi网络rtmp推流摄像头农场工地gb28181监控直播多人


数字渔业管理

智能柜相关资料

智能柜控制板

智能锁柜


arduino 写字机器人制作教程


GRBL相关资料

grbl

lasterGrbl和GRBL使用指南

GRBL串口控制命令及代码解析


自动灌溉

自动灌溉硬件

自动灌溉相关代码





灌溉系统所用硬件


水压传感器


另一款

水压传感器

压力传感器输出的是标准信号4~20mADC,这个信号是怎样转换成压力值的?在哪里转换的?

首先,这个4~20mA电流要通过一只高精密电阻转换成电压信号。这个电阻可能你的二次仪表中已经有了,也可能需要你自己连接。例如,在4~20mA回路中传入一只250欧的电阻,就可以把电流转换成1~5v的电压。




旋转角度传感器微调电位器


一般直流电机驱动板

资料网盘下载:https://pan.baidu.com/s/1PIdrVOh2WoYYsMYs5F3chQ

一、功能特点:

产品尺寸:50*26*15mm

螺旋桨直径:75mm

工作电压:5V

L9110驱动,可控制正反转配有安装孔,兼容舵机舵盘控制优质螺旋桨,效率高。可轻松吹灭20cm外的打火机火焰可用于救火机器人的制作,机器人设计开发必备

 

二、模块功能测试 

硬件要求 

Arduino控制器 × 

USB数据线 × 

9110风扇模块 × 

模块与Arduino板连接:

模块的VCC5V, GNDGNDINA接数字接口9INB接数字接口,如下图所示:


转动角度传感器

说明:

系列:位置传感器-角度,线性位置测量

系列: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购买时连接好压电陶瓷片的正负极。


LOAR 传输模块

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互转

电平转换器
是一个电压转换装置,电平转换分为单向转换和双向转换,还有单电源和双电源转换,双电源转换采用双轨方案具有满足各方面性能的要求

四路 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 写字机器人制作教程 

arduino 写字机器人制作教程

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

1.png

这些就是grbl回传的参数了,里面涵盖了所需要修改的参数,而且修改参数的方法也很简单,只需要输入$相应的序号=val,如修改xyz轴的行进一毫米的脉冲数可以输入$100=所需脉冲数(修改x轴),$101=所需脉冲数(修改y轴),$102=所需脉冲数(修改z轴),但是使各轴运动反向不是那么简单,因为grbl是根据设置掩码来反向电机的,所以需要查看源码,


根据这段代码可以看出xyz轴分别设置为第一第二第三启动,所以在设置相应轴电机运动反向可以通过将相应位置的掩码置位(根据二进制计算)就可以了,比如设置x轴反向$3=1(等效$3=00000001),设置xy轴电机反向输入$3=3(等效$3=00000011)即可!



lasterGrbl和GRBL使用指南

原文

0. 目录:

  1. 首页:https://github.com/gnea/grbl/wiki
  2. 编译Grbl:https://github.com/gnea/grbl/wiki/Compiling-Grbl
  3. 连接Grbl:https://github.com/gnea/grbl/wiki/Connecting-Grbl
  4. 将Grbl上传到Arduino:https://github.com/gnea/grbl/wiki/Flashing-Grbl-to-an-Arduino
  5. 经常问的问题
  6. grbl v1.1
  7. Grbl v1.1命令
  8. Grbl v1.1配置
  9. Grbl v1.1接口
  10. Grbl v1.1Jogging
  11. Grbl v1.1激光模式
  12. 如何控制数控等离子切割机的发射
  13. 已知的问题
  14. 设置归位周期
  15. 使用Grbl
  16. 接线限位开关

GRBL设置

  • 更改绘图仪设置

绘图仪的设置存储在非易失性存储器中,这意味着它们只需配置一次。[1]
GRBL中的默认设置如下所示:
Grbl参数配置说明
以下参数说明来源于:http://www.xn–bnq31s.xn–fiqs8s/?cate=34

参数说明
$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编译软件与使用方法:
推荐使用Programmer’sNotepad编译器,软件和使用方法自行下载:
链接:http://pan.baidu.com/s/1bOeH1k
Grbl程序下载软件与使用方法:
下载软件推荐使用 Arduloader,软件和使用方法自行下载:
链接:http://pan.baidu.com/s/1hrDdjDi
Grbl控制端软件GrblController:
链接:http://pan.baidu.com/s/1hsMMRbA

要更改任何设置,只需在命令行中输入设置编号,后跟“ =”,然后输入“ value”。完成后,键入$以 确 认 设 置 。 例 如 , 以确认设置。例如, 100 = 80告诉GRBL,您的绘图仪需要80步才能移动1毫米。

GRBL官方配置文件

原文地址:https://github.com/gnea/grbl/wiki/Grbl-v1.1-Configuration

Grbl v1.1配置

Charles Van Noland编辑了此页面 on 14 Dec 2017 · 18个修订
快速链接:

1. 入门

首先,使用您选择的串行端子连接到Grbl。

将波特率设置为115200为8-N-1(8位,无奇偶校验和1个停止位)。

连接后,您应该会看到Grbl提示符,如下所示:

Grbl 1.1f ['$' for help]1

键入并按Enter键以使Grbl打印帮助消息。您应该不会看的任何本地回显,然后输入。Grbl应该回应:

[HLP:$$ $# $G $I $N $x=val $Nx=line $J=line $SLP $C $X $H ~ ! ? ctrl-x]1

"命令是G r b l 系 统 命 令 , 用 于 调 整 设 置 , 查 看 或 更 改 G r b l 的 状 态 和 运 行 模 式 以 及 启 动 归 位 循 环 。 最 后 四 个 非 ? ”命令是Grbl系统命令,用于调整设置,查看或更改Grbl的状态和运行模式以及启动归位循环。最后四个非 -”命令是Grbl系统命令,用于调整设置,查看或更改Grbl的状态和运行模式以及启动归位循环。最后四个非?命令是实时控制命令,无论Grbl在做什么,它都可以随时发送。这些要么立即改变Grbl的运行行为,要么立即打印重要的实时数据的报告,例如当前位置(aka DRO)。

1. Grbl设置

$$-查看Grbl设置

要查看设置,请$$在连接到Grbl后键入并按Enter。Grbl应该以当前系统设置的列表作为响应,如下例所示。所有这些设置都是持久性的,并保存在EEPROM中,因此,如果您关闭电源,则下次启动Arduino时将重新加载这些设置。

所述x的$x=val指示特定设置,而val是设定值。在以前的Grbl版本中,每个设置都在()括号旁边有一个描述,但是不幸的是Grbl v1.1 +不再包含它们。这样做是为了释放宝贵的闪存以添加v1.1中可用的新功能。但是,大多数优秀的GUI都可以通过为您附上描述来帮助您,从而使您知道自己在看什么。

设置和样本值描述
$ 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.000X步/毫米
$ 101 = 250.000Y步/毫米
$ 102 = 250.000Z步/毫米
$ 110 = 500.000X最大速率,毫米/分钟
$ 111 = 500.000Y最大速率,mm / min
$ 112 = 500.000Z最大速率,mm / min
$ 120 = 10.000X加速度,mm / sec 2
$ 121 = 10.000Y加速度,mm / sec 2
$ 122 = 10.000Z加速度,mm / sec2
$ 130 = 200.000X最大行程,毫米
$ 131 = 200.000Y最大行程,mm
$ 132 = 200.000Z最大行程,mm
$ x = val-保存Grbl设置

$x=val命令可保存或更改Grbl设置,当通过串行终端程序连接到Grbl时,可以通过发送此命令来手动完成此设置,但是大多数Grbl GUI都会通过用户友好的功能为您完成此设置。

要手动将微秒步进脉冲选项更改为10us,请键入以下内容,然后按Enter:

$0=101

如果一切顺利,Grbl将以“ ok”响应,此设置存储在EEPROM中,并将永久保留或直到您更改它们为止。您可以通过键入$$再次查看系统设置来检查Grbl是否正确接收并存储了您的设置。

2. Grbl的$x=val设置及其含义

注意:从Grbl v0.9到Grbl v1.1,仅$10状态报告已更改,并且添加了新的$30$31主轴rpm最大/最小和$32激光模式设置。其他一切都一样。

$ 0 –步进脉冲,微秒

步进驱动器具有一定的最小步进脉冲长度。检查数据表或尝试一些数字。您希望步进驱动器能够可靠地识别出最短的脉冲。如果脉冲太长,则以很高的进给和脉冲速率运行系统时可能会遇到麻烦,因为步进脉冲可能会开始相互重叠。我们建议大约10微秒,这是默认值。

$ 1-步空闲延迟,毫秒

每当您的步进器完成一个动作并停止时,Grbl都会通过该值延迟禁用步进器。或,您可以通过将此值设置为最大255毫秒来始终保持启用轴(通电以保持位置)的状态。同样,只需重复一次,您可以通过设置保持所有轴始终处于启用状态$1=255

步进器空闲锁定时间是在禁用之前Grbl将保持步进器锁定的时间长度。根据系统,可以将其设置为零并禁用它。在其他情况下,您可能需要25到50毫秒来确保在禁用之前轴完全停止。这有助于解决不喜欢长时间不做任何事情的机器电机的问题。另外,请记住,某些步进驱动器不会记住他们停止在哪个微步上,因此,当您重新启用该驱动程序时,您可能会因此而目睹一些“丢失”的步骤。在这种情况下,只需通过启用步进器即可$1=255。

$ 2 –步骤端口反转,掩码

该设置将步进脉冲信号反相。默认情况下,步进信号从正常低电平开始,并在发生步进脉冲事件时变为高电平。在由设置的步进脉冲时间后$0,该引脚复位为低电平,直到发生下一步进脉冲事件为止。反转后,步进脉冲的行为会从正常高电平切换为脉冲期间的低电平,然后再回到高电平。大多数用户不需要使用此设置,但是对于某些有特殊要求的CNC步进驱动器来说,此设置很有用。例如,方向引脚和步进脉冲之间的人为延迟可以通过使步进引脚反相来产生。

该反转掩码设置是将要反转的轴存储为位标志的值。您确实不需要完全了解其工作原理。您只需要输入要反转的轴的设置值即可。例如,如果要反转X轴和Z轴,$2=5则将其发送到Grbl,设置现在应显示为$2=5 (step port invert mask:00000101)。

设定值掩码反转X反转Y反转Z
000000000???
100000001???
200000010???
300000011???
400000100???
500000101???
600000110???
700000111???
$ 3 –方向端口反转,掩码

此设置反转每个轴的方向信号。默认情况下,Grbl假定当方向引脚信号为低电平时,轴沿正方向移动;当方向引脚信号为高时,轴沿负方向移动。通常,某些机器的轴不会以这种方式移动。对于反向移动的那些轴,此设置将反转方向销信号。

反转掩码设置的工作原理与步进端口反转掩码完全相同,并存储要反转的轴作为位标志。要配置此设置,您只需要发送要反转的轴的值即可。使用上表。例如,如果只想反转Y轴方向,则发送$3=2给Grbl,设置现在应显示为

$3=2 (dir port invert mask:00000010)1
$ 4-步启用反转,布尔

默认情况下,步进使能引脚为高电平以禁用,而为低电平。如果您的设置需要相反的操作,只需输入即可反转步进启用引脚$4=1。使用禁用$4=0。(可能需要重新启动电源以加载更改。)

$ 5-限制引脚反转,布尔

默认情况下,极限引脚通过Arduino的内部上拉电阻保持在常高状态。当极限引脚为低电平时,Grbl将其解释为触发。对于相反的行为,只需输入即可反转极限销$5=1。使用禁用$5=0。您可能需要重启然后再加载更改。

注意:为了更高级的使用,可以在config.h中禁用限制引脚上的内部上拉电阻。

$ 6-探针反相,布尔

默认情况下,探针由Arduino的内部上拉电阻保持在常高状态。当探针引脚为低电平时,Grbl将其解释为触发。对于相反的行为,只需键入即可反转探针$6=1。使用禁用$6=0。您可能需要重启然后再加载更改。

$ 10-状态报告,遮罩

此设置确定当“?”时它将向用户报告哪些Grbl实时数据。状态报告已发送。该数据包括当前运行状态,实时位置,实时进给速度,引脚状态,当前倍率值,缓冲区状态和当前正在执行的g代码行号(如果通过编译时选项启用)。

默认情况下,Grbl v1.1 +中的新报告实现将几乎包含标准状态报告中的所有内容。许多数据是隐藏的,只有更改后才会显示。与旧的报表样式相比,这极大地提高了效率,并允许您获得更快的更新并仍然获取有关计算机的更多数据。界面文档概述了它的工作方式,并且大多数仅适用于GUI开发人员或好奇的人。

为了使事情简单和一致,Grbl v1.1只有两个报告选项。这些主要是为用户和开发人员提供的帮助。

可以指定位置类型以显示机器位置(MPos:)或工作位置(WPos:),但不能同时显示两者。在某些情况下,当通过串行终端直接与Grbl进行交互时,启用工作位置很有用,但是默认情况下应使用机器位置报告。
可以启用Grbl的计划器和串行RX缓冲区的使用数据。这显示了各个缓冲区中可用的块或字节数。通常用于帮助确定在测试流接口时Grbl的性能。默认情况下应禁用此功能。
使用下表启用和禁用报告选项。只需添加列出您要启用的值,然后通过向Grbl发送您的设置值来保存它。例如,带有机器位置且没有缓冲区数据报告的默认报告设置为$10=1。如果需要工作位置和缓冲数据,则设置为$10=2

报告类型描述
职位类型0启用WPos:禁用MPos:
职位类型1启用MPos:。禁用WPos:
缓冲数据2Buf:出现“已启用” 字段,其中包含计划程序和串行RX可用缓冲区。
$ 11-接线端偏差,mm

加速度管理器使用结点偏差来确定它可以在G代码程序路径的线段结点处移动的速度。例如,如果G代码路径急转10度,并且机器以全速移动,则此设置有助于确定机器需要减速多少才能安全通过弯道而不会丢失步数。

我们如何计算它有些复杂,但是通常,较高的值可以使拐角处的运动更快,同时增加了丢失梯级和位置的风险。较低的值会使加速管理器更加谨慎,并会导致谨慎而缓慢的转弯。因此,如果您遇到机器尝试过快转弯的问题,请减小此值以使其在进入转弯时变慢。如果您希望机器通过结点移动得更快,请增加此值以加快速度。对于好奇的人,请单击此链接以了解Grbl的转弯算法,该算法通过一种非常简单,高效且健壮的方法来考虑速度和接合角。

$ 12 –电弧公差,毫米

Grbl通过将G2 / G3圆,弧和螺旋细分为细小的细线来渲染G2 / G3的圆,弧和螺旋,以使弧跟踪精度永远不会低于此值。您可能永远不需要调整此设置,因为0.002mm它远低于大多数CNC机床的精度。但是,如果您发现自己的圆太粗或弧形追踪的速度很慢,请调整此设置。较低的值可提供较高的精度,但可能会因过多的细线使Grbl过载而导致性能问题。或者,较高的值会导致较低的精度,但由于Grbl需要处理的线数较少,因此可以提高电弧性能。

出于好奇,将圆弧公差定义为距线段的最大垂直距离,线段的端点位于圆弧(也称为弦)上。对于一些基本几何图形,我们求解线段的长度以跟踪满足此设置的圆弧。用这种方式对电弧建模非常好,因为弧线段会自动调整长度并按比例缩放,以确保最佳的电弧追踪性能,同时又不会损失精度。

$ 13-报告英寸,布尔值

Grbl具有实时定位报告功能,可向用户提供有关当时机器确切位置以及坐标偏移和探测参数的用户反馈。默认情况下,它设置为以mm为单位报告,但是通过发送$13=1命令,将此布尔标志发送为true,这些报告功能现在将以英寸为单位报告。$13=0重新设置为毫米。

$ 20-软限制,布尔值

软限制是一项安全功能,可帮助您防止机器行驶太远且超出行驶限制,撞毁或破坏昂贵的物品。它通过了解每个轴的最大行程限制以及Grbl在机器坐标中的位置来工作。每当有新的G代码运动发送到Grbl时,它都会检查您是否意外地超出了机器空间。如果这样做,Grbl会在任何位置发出即时进给保持,关闭主轴和冷却液,然后设置系统警报以指示问题所在。机器位置将在之后保留,因为它不是由于硬限制而立即被迫停止。

注意:软限制要求启用归位和准确的轴最大行程设置,因为Grbl需要知道它在哪里。$20=1启用和$20=0禁用。

$ 21-硬限制,布尔值

硬限制的工作原理与软限制基本相同,但改用物理开关。基本上,您在每个轴的行进结束时或在任何您觉得如果程序移到不应移动的地方可能会遇到麻烦的地方,连接一些开关(机械的,磁性的或光学的)。开关触发后,它将立即停止所有运动,关闭冷却液和主轴(如果已连接),并进入警报模式,这将迫使您检查机器并重置所有内容。

要在Grbl上使用硬极限,必须使用内部上拉电阻将限位引脚保持在高电平,因此您要做的就是将常开开关的引脚与地线连接在一起,并通过启用硬极限$21=1。(禁用$21=0。)我们强烈建议您采取防止电干扰的措施。如果要限制一个轴的行进两端,只需将两个开关与销和地平行地接线,这样,如果其中一个跳闸,就会触发硬极限。

请记住,硬极限事件被认为是关键事件,在这种情况下,步进器会立即停止并且可能会丢失步数。Grbl没有任何位置反馈,因此无法保证它对位置有任何了解。因此,如果触发了硬限制,Grbl将进入无限循环警报模式,这使您有机会检查计算机并强制您重置Grbl。请记住,这纯粹是一项安全功能。

$ 22-归位周期,布尔

啊,归位。对于刚启动CNC的用户,每次在两次会话之间启动Grbl时,都使用归位循环来精确准确地定位机器上已知且一致的位置。换句话说,您每次都准确知道自己在什么位置。假设您开始加工某物或准备开始下一步工作,并且电源中断,则重新启动Grbl,而Grbl不知道步进在哪里,这是由于步进器处于开环控制状态。您剩下的任务就是弄清楚自己在哪里。如果进行归位,则始终可以找到机器零参考点,因此,您所要做的就是运行归位循环并从上次中断的地方继续。

要设置Grbl的归位周期,您需要将限位开关固定在不会碰撞或移动的固定位置,否则基准点会被弄乱。通常将它们设置在每个轴的+ x,+ y,+ z的最远点。将限位开关与限位销连接在一起,添加推荐的RC滤波器以帮助减少电气噪声并启用归位功能。如果您好奇,可以将限位开关用于硬限位和归位。他们彼此打得很好。

首次尝试原点复归之前,请确保已正确设置所有内容,否则原点复归可能会出现异常情况。首先,确保您的机器轴按照直角坐标在正确的方向上移动(右手定则)。如果不是,请使用$3方向反转设置进行修复。其次,确保您的限位开关销在Grbl的状态报告中未显示为“已触发”。如果是,请检查接线和设置。最后,确保$13x最大行程设置有些准确(在20%以内),因为Grbl使用这些值来确定搜索归位开关的距离。

默认情况下,Grbl的归位循环首先将Z轴正向移动以清除工作空间,然后同时沿正方向同时移动X和Y轴。为了设置归位周期的行为,页面下方还有更多的Grbl设置来描述它们的工作(以及编译时选项)。

此外,启用归位后还要注意一件事。Grbl将锁定所有G代码命令,直到执行归位循环为止。这意味着没有轴运动,除非锁定被禁用($X),但稍后会更多。大多数(即使不是全部)CNC控制器也会执行类似的操作,因为它主要是一项安全功能,可以防止用户犯下定位错误,这很容易做到,并且当错误毁坏零件时会感到难过。如果您发现此问题烦人或发现任何怪异的错误,请告诉我们,我们将尝试进行处理,以使每个人都很高兴。??

注意:请查看config.h,以获取高级用户的更多归位选项。您可以在启动时禁用归位锁定,配置在归位循环中哪些轴先移动以及以什么顺序等等。

$ 23-归位方向反转,遮罩

默认情况下,Grbl假设您的归位限位开关在正方向上,首先将z轴正向移动,然后将xy轴正向移动,然后再通过在开关周围缓慢地来回移动来精确定位机器零。如果您的机器在负方向上有一个限位开关,则回原点方向遮罩会反转轴的方向。就像步进端口反转掩码和方向端口反转掩码一样,您要做的就是发送表中的值以指示要反转并在相反方向上搜索的轴。

$ 24-归位进给,mm / min

原点复归循环首先以较高的寻道速率搜索限位开关,找到限位开关后,以较低的进给速率移动到机床零位的精确位置。归位进给速度是较慢的进给速度。将此值设置为任何可重复且精确的机器零位定位的速率值。

$ 25-归位搜索,毫米/分钟

归位寻道率是归位周期搜索率,或它首次尝试找到限位开关的速率。在足够短的时间内调整到限位开关的速度,而不会太快地撞到您的限位开关。

$ 26-归位反跳,毫秒

每当开关触发时,其中一些可能会产生电气/机械噪声,在建立之前实际上会“反弹”信号的高低两毫秒。要解决此问题,您需要使用某种硬件来对信号进行反跳信号调节器或通过软件延迟很短的时间使信号弹起。Grbl会执行短暂的延迟,仅在定位机器零点时归位。将此延迟值设置为交换机可重复进行归位所需的任何值。在大多数情况下,5-25毫秒是可以的。

$ 27-归位拉脱,毫米

为了更好地利用硬限位功能(归位可以共享相同的限位开关),归位循环完成后,归位周期将通过该拉出行程移开所有限位开关。换句话说,它有助于防止在归位循环后意外触发硬限制。确保该值足够大以清除限位开关。否则,Grbl将因未能清除错误而引发警报错误。

$ 30-主轴spindle最高转速,RPM

这将设置最大5V PWM引脚输出的主轴速度。例如,如果要在5V下设置10000rpm,请编程$30=10000。对于5V时的255rpm,编程$30=255。如果程序试图将更高的主轴RPM设置为大于$30最大主轴速度,则Grbl将仅输出最大5V,因为它不能再快得多。默认情况下,Grbl以255个等间隔增量将最大-最小RPM与5V-0.02V PWM引脚输出线性相关。当PWM引脚读取0V时,表明主轴已禁用。请注意,config.h中还有其他配置选项可用于调整其操作方式。

$ 31-主轴最低转速,RPM

这将设置最小0.02V PWM引脚输出的主轴速度(禁用0V)。Grbl接受较低的RPM值,但PWM输出不会低于0.02V,除非RPM为零。如果为零,则主轴被禁用,PWM输出为0V。

$ 32-激光模式,布尔

启用后,当用主轴速度(激光功率)编程时,Grbl将通过连续的G1,G2或G3运动命令连续移动S。主轴PWM引脚将在每次运动时立即更新,而不会停止。使用此模式之前,请阅读GRBL激光文档和您的激光设备文档。激光非常危险。它们会立即永久损坏您的视力并引起火灾。Grbl对固件可能引起的任何问题(由其GPL许可定义)不承担任何责任。

禁用后,Grbl会像往常一样运行,并根据每个S主轴速度命令停止运动。这是铣床的默认操作,允许暂停以使主轴改变速度。

$ 100,$ 101和$ 102 – [X,Y,Z]步/毫米

Grbl需要知道每个步骤将使该工具实际应用到什么程度。要计算机器轴的步长/毫米,您需要知道:

步进电机每转一圈所经过的毫米数。这取决于皮带传动齿轮或丝杠螺距。
步进电机每转的完整步数(通常为200)
控制器每步的微步(通常为1、2、4、8或16)。提示:使用较高的微步长值(例如16)会降低步进电机的扭矩,因此请使用最低的步长,以便获得所需的轴分辨率和舒适的运行性能。
然后可以像这样计算步长/ mm:
s t e p s p e r m m = ( s t e p s p e r r e v o l u t i o n ? m i c r o s t e p s ) m m p e r r e v steps_per_mm = \frac{(steps_per_revolution*microsteps)}{mm_per_rev}stepspermm=mmperrev(stepsperrevolution?microsteps)

计算每个轴的该值,并将这些设置写入Grbl。

$ 110,$ 111和$ 112 – [X,Y,Z]最大费率,mm / min

设置每个轴可以移动的最大速率。每当Grbl计划移动时,它都会检查移动是否导致这些单个轴中的任何一个超出其最大速率。如果是这样,它将减慢运动速度,以确保所有轴都不超出其最大速率限制。这意味着每个轴都有自己独立的速度,这对于限制通常较慢的Z轴非常有用。

确定这些值的最简单方法是通过逐渐增加最大速率设置并移动它来一次测试每个轴。例如,要测试X轴,请向Grbl发送G0 X50具有足够行进距离的东西,以使该轴加速到其最大速度。您会知道,当步进器停转时,您已达到最大速率阈值。会产生一点噪音,但不应伤害您的电动机。输入一个比该值低10-20%的设置,这样您就可以考虑磨损,摩擦以及工件/工具的质量。然后,重复其他轴。

注意:此最大速率设置还可以设置G0搜索速率。

$ 120,$ 121,$ 122 – [X,Y,Z]加速度,毫米/秒^ 2

这将以毫米/秒/秒为单位设置轴加速度参数。简单地说,较低的值会使Grbl较慢地运动,而较高的值会使运动更紧,并更快地达到所需的进给速度。与最大速率设置非常相似,每个轴都有自己的加速度值,并且彼此独立。这意味着多轴运动将仅以最低贡献轴的速度加速。

同样,与最大速率设置一样,确定此设置的值的最简单方法是用缓慢增加的值分别测试每个轴,直到电动机停转为止。然后将加速度设置定为低于此绝对最大值10-20%的值。这应该考虑磨损,摩擦和质量惯性。我们强烈建议您在使用新设置之前对某些G代码程序进行干燥测试。有时在所有轴上一起移动时,机器上的负载会有所不同。

$ 130,$ 131,$ 132 – [X,Y,Z]最大行程,毫米

这将以毫米为单位设置每个轴从一端到另一端的最大行程。仅当启用了软限制(和原点复归)时,此功能才有用,因为Grbl的软限制功能仅使用此功能来检查是否已通过运动命令超出了机器限制。

3. 首次设置机器的快速指南

Grbl的默认配置故意非常通用,以帮助确保用户无需调整设置即可看到成功的运动。通常,您要做的第一件事就是让步进电机运行,通常无需将其连接到CNC。根据制造商指南,将Grbl连接到您的步进驱动器和步进电机。通过串行终端或许多Grbl GUI之一连接到Grbl。发送一些G1或G0命令Grbl。您应该看到步进电机正在旋转。如果您在步进电机上遇到麻烦,请尝试以下操作:

  • 确保按照步进驱动器制造商指南正确连接和供电。
  • 如果您的步进器已经安装在CNC中,请确保您的轴可以自由移动并且不会明显束缚。如果您无法轻松分辨,请尝试卸下步进电机,并检查它们是否在无负载的情况下运行。
  • 确保步进电机和轴的线性机构都牢固牢固。传动系统组件上的小紧定螺钉变松是一个非常普遍的问题。重新拧紧并尝试使用一些永久性的螺纹储物柜(乐泰蓝),如果它持续松动。
  • 对于更困难的问题,请尝试消除过程以快速隔离问题。首先断开所有与Arduino的连接。测试Grbl本身是否运行正常。然后,一次添加一件事并进行测试。
  • 如果您的步进电机通电并且在尝试移动时发出磨擦声,请尝试降低“ $”加速度和最大速率设置。这种声音表明您的步进器正在失去步伐,并且由于扭矩负载过大或过快而无法跟上。
  • Grbl的默认步进脉冲设置涵盖了市场上绝大多数的步进驱动器。虽然很不常见,但如果您仍然遇到问题或设置不正常,请检查这些设置。
    接下来,您将需要确保您的机器根据笛卡尔(XYZ)坐标系朝正确的方向移动,并满足右手规则,如下所示:

如果尚未将步进电机安装到CNC中,则将其安装。向Grbl发送一些运动命令,例如G91 G0 X1或G91 G0 X-1,它们将使x轴分别移动+ 1mm和-1mm。检查所有轴。如果轴未正确移动,请更改$3方向端口掩码设置以反转方向。

如果您不熟悉如何在CNC机器上设置坐标系,请参阅LinuxCNC的这张精美图。请记住,运动是相对于工具的。因此,在典型的CNC龙门铣床上,刀具将移动而不是固定工作台。如果x轴向右正对齐,则正向运动命令会将工具向右移动。而带有固定工具的移动工作台会将同一命令的工作台向左移动,因为该工具相对于工作台向右移动。

最后,调整您的设置以接近您想要的或最大的性能。首先,请确保您的$100,$101和$102轴步长/毫米设置对您的设置正确。这取决于您的步进增量,驱动器上的微步以及机械参数。如果您的机器制造商没有为您提供特定的机器,则在线上有多种资源可以显示如何计算该机器。调整$12x加速度和$11x最大速率设置以提高性能。设置为不大于绝对最大值的80%,以考虑惯性,切削力以及电机转矩随速度降低的情况。设置你的$13x最大行程设置(如果您打算使用归位或软限制)。建议您现在输入近似于实际行程的内容,以免将来出现问题。

至此,您已经准备好开始了!Grbl现在可以移动您的CNC机床并运行g代码作业。如果需要添加更多功能,例如用于归位或硬限位的限位开关或主轴/激光控制。还有其他Wiki页面可以帮助您。祝好运并玩得开心点!

激光开/关(M3 / M5)不起作用?

原文地址:https://github.com/arkypita/LaserGRBL/issues/23
可替代的:http://www.bachinmaker.com/wiki/doku.php?id=start

GRBL的PWM功能–如何控制激光或变速主轴。

https://blog.protoneer.co.nz/grbls-pwm-functionality-how-to-control-a-laser-or-variable-speed-spindle/
M3 / M4激光模式:http://lasergrbl.com/usage/raster-image-import/target-image-size-and-laser-options/#laser-modes

https://space.bilibili.com/16061216/



GRBL串口控制命令及代码解析

单片机串口跟电脑连接,测试GRBL串口命令

1.输入:“$”显示如下:

 1.png

 

$$(view Grbl settings) //命令“$$”查看GRBL设置

$x=value (save Grbl setting) //保存设置

$H (run homing cycle)//返回原点

? (current status)//显示当前坐标

ctrl-x (reset Grbl)//复位

2.输入:“$$”显示如下

 2.png

 


 

$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 常闭表示一直供电,信号来后断开

1.jpg

arduino的IO口驱动大功率设备的新选择,MOS驱动器

 设计这款驱动器的想法由来已久,很多时候缺少一个可靠好用的arduino的IO口功率放大器,一般要用的时候,能用固态继电器搞定的用固态继电器(不计成本),或者洞洞板搭一个三极管扩流电路,甚至不择手段的用上了电机驱动板。
   反正各种的不方便,so。。。痛苦纠结了N久,设计了一款扩流板电路,就是下图展示的这款(这款已经是成熟的第三代了)
1.jpg

DSC_0126a.jpg (122.13 KB, 下载次数: 40)

下载附件

ocrobot 扩流板

2014-6-30 15:09 上传



这款板子充分考虑到了实际使用中驱动1W-50W功率范围内的直流设备,比如灯泡,水泵 led灯条等,需要功率,同时可能需要pwm控制的器件,并且充分考虑其成本。以及安全性。

2.jpg



so,就如上图所示,灯条轻松跑呼吸灯,提供四个独立的通道~~~



Arduino Pro Mini


LORA知识

lora基本参数

  1. 速率(0.3 1.2 2.4 4.8 9.6 19.2 ..)

  2. 地址 0-65543

  3. 信道 0-31 共32个信道

    1.jpg

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+SENDMODE SEND设置为发送模式
AT+MODE+RECVMODE 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度;

1.jpg




自动灌溉相关代码

存储代码

#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();      //重启程序开始

  }











Top