IoT
Config
node-red &
windows:http://localhost:1880
ubuntu:http://192.168.109.128:1880
influxDB:http://192.168.109.128:8086
chiaki,8位顺序
Node-red 数采实作
Ubuntu 配置 Node-red
Weather 数据读取
MQTT 数据读写
InfluxDB 数据写人
Modbus TCP 数据读取
Arduino 数采实作
温度传感器实现
Node-Red配置
windows
安装node.js
安装node-red
ubuntu
ins
clear 清除
安装Ubuntu Server
安装SSH Server 要勾选安装
sudo apt update
sudo apt upgrade
如果没有勾选:sudo apt-get install openssh-server
安装Node.js
sudo apt install nodejs
node -v
安装npm
sudo apt install npm
npm -v
换源
npm 镜像源,通常用于加速 npm 包的下载速度。
npm config set registry https://registry.npmmirror.com
npm config set registry https://registry.npm.taobao.org
安装Node-red
sudo npm install -g (--unsafe-perm) node-red
安装MQTT服务器
sudo apt install mosquitto
mosquitto -v
安装文字编辑器
sudo apt install vim
修改配置档
sudo vim /etc/mosquitto/mosquitto.conf
listener 1883
allow_anonymous true
i:插入模式
ESC:退入命令模式,再输入“:”
w:写入
q:退出
wq:写入并退出
端口测试
ip addr
sudo apt install telnet
ping 192.168.109.128 (-t)
telnet 192.168.109.128 1883
背景服务相关
systemctl status/start/enable/disable node-red
sudo systemctl status/restart/start/stop/enable mosquitto
sudo systemctl start mosquitto
检视目录
ll 查看当前目录所有文件
pwd 查看当前目录地址
Node-Red应用
Node-Red_Weather
安装weather
geo location:https://www.iplocation.net/
Yangzhou
longitude:118.7778
latitude:32.0617
使用:时间戳,weather,debug
具体:周期性触发,手动触发
Node-red_MQTT
mqtt-out
MQTT连接虚拟机
var temp = msg.payload.current.temperature.value;
var unit = msg.payload.current.temperature.unit;
msg.payload = {
"temp": parseFloat(temp),
"unit": unit
};
return msg;
Node-red_influxDB
安装参考 https://computingforgeeks.com/install-influxdb-on-ubuntu-and-debian/
安装influx
var temp = msg.payload.current.temperature.value;
var unit = msg.payload.current.temperature.unit;
msg.payload = {
"temp": parseFloat(temp),
"unit": unit
};
return msg;
Node-red_Modbus
npm config set registry registry=https://registry.npm.taobao.org
npm install -g node-red-contrib-modbus
主机(Master)→从机(Slave)
Node-red 安装 contrib-modbus
Modbus Flex Server
Node-red_ttyUSB
安装 node-red-contrib-buffer-parser
Modbus read
ls /dev/ttyUSB* 驱动位置
sudo chmod 777 /dev/ttyUSB*
Arduino
LED闪烁
#define led_pin 13
void setup() {
// put your setup code here, to run once:
pinMode(led_pin,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(led_pin, HIGH);
delay(1000);
digitalWrite(led_pin, LOW);
delay(1000);
}
温度读取
点击查看代码
#include <dht.h> // 包含DHT库,用于读取DHT传感器的数据
#include <LiquidCrystal_I2C.h> // 包含I2C液晶屏库,用于显示数据
dht DHT; // 创建DHT对象实例,用于读取传感器数据
#define DHT22_PIN 5 // 定义DHT22传感器数据引脚为5
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// LiquidCrystal_I2C lcd(0x27,20,4);
// 定义结构体用于存储统计数据,包括总读取次数、成功次数、不同类型的错误次数等
struct {
uint32_t total; // 总读取次数
uint32_t ok; // 成功读取次数
uint32_t crc_error; // 校验和错误次数
uint32_t time_out; // 超时错误次数
uint32_t connect; // 连接错误次数
uint32_t ack_l; // ACK低错误次数
uint32_t ack_h; // ACK高错误次数
uint32_t unknown; // 未知错误次数
} stat = { 0, 0, 0, 0, 0, 0, 0, 0}; // 初始化结构体为0
// 初始化设置函数
void setup() {
Serial.begin(115200); // 启动串口通信,波特率设置为115200
Serial.println("dht22_test.ino"); // 输出程序名称
Serial.print("LIBRARY VERSION: "); // 输出DHT库版本
Serial.println(DHT_LIB_VERSION);
Serial.println();
// 输出列标题
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)\tTime (us)");
// LCD_Init
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(3, 0);
lcd.print("Hello, world!");
lcd.setCursor(2, 1);
lcd.print("Wokwi Online IoT");
lcd.setCursor(5, 2);
lcd.print("Simulator");
lcd.setCursor(7, 3);
lcd.print("Enjoy!");
delay(1000);
}
// 主循环函数
void loop() {
// 读取传感器数据
Serial.print("DHT22, \t"); // 输出传感器类型
uint32_t start = micros(); // 记录开始时间(微秒)
int chk = DHT.read22(DHT22_PIN); // 从DHT22引脚读取数据
uint32_t stop = micros(); // 记录结束时间(微秒)
stat.total++; // 总读取次数增加
// 检查读取结果,并根据不同的返回值更新统计数据和输出信息
switch (chk) {
case DHTLIB_OK: // 读取成功
stat.ok++;
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM: // 校验和错误
stat.crc_error++;
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT: // 超时错误
stat.time_out++;
Serial.print("Time out error,\t");
break;
case DHTLIB_ERROR_CONNECT: // 连接错误
stat.connect++;
Serial.print("Connect error,\t");
break;
case DHTLIB_ERROR_ACK_L: // ACK低错误
stat.ack_l++;
Serial.print("Ack Low error,\t");
break;
case DHTLIB_ERROR_ACK_H: // ACK高错误
stat.ack_h++;
Serial.print("Ack High error,\t");
break;
default: // 未知错误
stat.unknown++;
Serial.print("Unknown error,\t");
break;
}
// 输出传感器的湿度和温度数据
Serial.print(DHT.humidity, 1); // 输出湿度(保留1位小数)
Serial.print(",\t");
Serial.print(DHT.temperature, 1); // 输出温度(保留1位小数)
Serial.print(",\t");
Serial.print(stop - start); // 输出读取所需时间
Serial.println();
// 更新LCD显示的湿度和温度数据
lcd.clear(); // 清空LCD显示
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.print(DHT.temperature, 1); // 显示温度(保留1位小数)
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.print(DHT.humidity, 1); // 显示湿度(保留1位小数)
lcd.print(" %");
// 每20次读取后,输出统计数据
if (stat.total % 20 == 0) {
Serial.println("\nTOT\tOK\tCRC\tTO\tCON\tACK_L\tACK_H\tUNK");
Serial.print(stat.total); // 总读取次数
Serial.print("\t");
Serial.print(stat.ok); // 成功读取次数
Serial.print("\t");
Serial.print(stat.crc_error); // 校验和错误次数
Serial.print("\t");
Serial.print(stat.time_out); // 超时错误次数
Serial.print("\t");
Serial.print(stat.connect); // 连接错误次数
Serial.print("\t");
Serial.print(stat.ack_l); // ACK低错误次数
Serial.print("\t");
Serial.print(stat.ack_h); // ACK高错误次数
Serial.print("\t");
Serial.print(stat.unknown); // 未知错误次数
Serial.println("\n");
}
delay(2000); // 每次读取后延迟2秒
}
Addition
SPC 单变量统计过程控制
FDC 多变量统计过程控制
Node-Red采集数据,MQTT/InfluxDB分析数据
Dayload 酬载
msg 消息
scope