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

posted @ 2024-09-28 16:55  Chiaki17  阅读(27)  评论(0编辑  收藏  举报