采集器采集质量和应变
本帖最后由 王大富 于 2022-1-5 00:25 编辑接线和之前一致#include <ESP8266WiFi.h> //esp8266wifi模块库
#include <ESP8266WiFiMulti.h> //自动链接最强wifi库
#include <DNSServer.h> //WiFiManager库要用的
#include <PubSubClient.h> //MQTT协议中的库
#include <Ticker.h> //时间记录库
#include <ArduinoJson.h> //调用Json数据库
#include <Wire.h>
#include <WiFiManager.h> //WiFiManager库
#include "DHTesp.h" //温度DHT11模块函数库
#include "FastLED.h" //FastLED库用于调用随机函数库
#include <stdlib.h> //接收数据的转化
#include <stdio.h>
#include "JXBS.h" //土壤湿度库
#define debugSerial Serial1
#define PRODUCT_ID "448207" //Onenote产品名(需修改)
#define API_KEY "LHVGqRwz22HsF7h30cOF2bxh=3E="//"CDglbagwPMllUURDk9mO=qKTozU="//产品密钥(需修改)
#define DEVICE_ID"876065433" //设备名(需修改),与开发板没有关系,由平台生成的
const char* mqttServer = "183.230.40.39"; //onenet地址(不修改)
const uint16_t mqttPort = 6002; //mqtt接口端口(不修改)
#define TOPIC "ceshitopic1" //订阅主题
#define LED1 D2
#define LED2 D3
ESP8266WiFiMulti wifiMulti; //自动链接wifi
#define RELAY1D7//是宏定义的意思,将一个RELAY变量强制定义为1号脚位
#define RELAY2D8//是宏定义的意思,将一个RELAY变量强制定义为2号脚位
DHTesp dht; //温度
WiFiClient wifiClient; //
PubSubClient mqttClient(wifiClient); //
Ticker ticker; //用于记录时间
int count=0,j =0,bt=0,ii=0,nn=20,n=80,m=4,m1=1; //定义参数变量
char msgJson;//msgJson数据长度
char msg_buf;//
char msgJson1;//msgJson数据长度
char msg_buf1;//
char dataTemplate1[] = "{\"Strain1\":%.2f,\"Strain2\":%.2f,\"Mass\":%.2f,\"DiffStrain1\":%.2f,\"DiffStrain2\":%.2f,\"DiffMass\":%.2f,\"Reset\":%d}"; //信息模板,(需修改)
char dataTemplate[] = "{\"rtStrain1\":%.2f,\"rtStrain2\":%.2f,\"rtMass\":%.2f,\"rsDiffStrain1\":%.2f,\"rsDiffStrain2\":%.2f,\"rsDiffMass\":%.2f,\"m\":%d}"; //信息模板,(需修改)
extern float DATA1 = 0.0, DATA2 = 0.0, DATA3 = 0.0, DATA4 = 0.0, DATA5 = 0.0,DATA6 = 0.0, DATA7 = 0.0,DATA8 = 0.0;
extern float DATA10 = 0.0, DATA20 = 0.0, DATA30 = 0.0, DATA40 = 0.0, DATA50 = 0.0,DATA60 = 0.0, DATA70 = 0.0,DATA80 = 0.0;
extern float Diff_DATA1,Diff_DATA2,Diff_DATA3;
void setup() { //里面的函数只执行一次
Serial.begin(9600);
wifiMulti.addAP("CMCC-PbWq","9bf07201");//添加多个wifi网络
wifiMulti.addAP("4G-UFI-19DE","seuseucyd");
wifiMulti.addAP("esp8266","esp82661");
wifiMulti.addAP("4G-UFI-5FD6","onenetesp8266");
wifiMulti.addAP("4G-CPE-6CAA","12345678");
pinMode(LED_BUILTIN, OUTPUT); //设置板上LED引脚为输出模式
pinMode(LED2, OUTPUT); //设置板上LED引脚为输出模式
WiFi.mode(WIFI_STA); //设置wifi模式
dht.setup(D4, DHTesp::DHT11); //温湿度模块DHT11初始化,D4脚位
connectWifi(); //链接Wifi函数
mqttClient.setServer(mqttServer, mqttPort); //mqttServer是onenet地址,mqtt接口端口mqttPort
mqttClient.setCallback(receiveCallback); //设置MQTT订阅回调函数
connectMQTTServer(); //链接MQTT服务器函数
ticker.attach(1, tickerCount);
}
void loop() { //里面的函数无限循环执行
if (mqttClient.connected()) { //如果开发板成功连接服务器
pubMQTTmsg(); //调用pubMQTTmsg()函数发送数据到云端
delay(1000);
mqttClient.loop();
} else { //如果开发板未能成功连接服务器
connectMQTTServer(); //则尝试连接服务器
}
}
int tickerCount() {
count++;
}
void connectMQTTServer() { //通过MQTT协议链接Onenet
String clientId = DEVICE_ID;
String productId = PRODUCT_ID;
String apiKey = API_KEY;
if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
subscribeTopic(); //订阅指定主题
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
String topicString = "temperature"+ WiFi.macAddress();
char subTopic;
strcpy(subTopic, topicString.c_str()); //
if (mqttClient.subscribe(subTopic)){ //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
Serial.println("Subscrib Topic:");
Serial.println(subTopic);
} else {
Serial.print("Subscribe Fail...");
}
}
void receiveCallback(char* topic, byte* payload, unsigned int length) {//反调函数用于接收平台下发的消息
for (int i = 0; i < length; i++){//按字符一个一个输出
}
payload = '\0'; // 添加一个空值使其转化为字符数组
String payload1=(char *)payload;
m = atoi((char *)payload);//将字符数组转化为整型数组
if (payload1 == "21000"){//测试下发数据,如果收到的信息以“1”为开始
j=0;//用于清零
} else if (payload1 == "20000"){}
else { n=nn*m; }
}
void pubMQTTmsg() { //onenet数据点上传系统主题
String topicString = "$dp";
char publishTopic;
strcpy(publishTopic, topicString.c_str()); //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,json数据转换为数组
////////////////////////////////////////
for(ii=1;ii<=n;ii++){
connectMQTTServer(); //则尝试连接服务器
mqttClient.loop();
readJXBS1();delay(1000);JXBSListen1();
DATA1=strain_1; DATA2=strain_2;DATA3=strain_3;DATA4=strain_4; DATA5=strain_5;DATA6=strain_6;DATA7=strain_7;DATA8=strain_8;
if (DATA1>32768){DATA1=DATA1-65536;}
if (DATA2>32768){DATA2=DATA2-65536;}
if (DATA3>32768){DATA3=DATA3-65536;}
if (DATA4>32768){DATA4=DATA4-65536;}
if (DATA5>32768){DATA5=DATA5-65536;}
if (DATA6>32768){DATA6=DATA6-65536;}
if (DATA7>32768){DATA7=DATA7-65536;}
if (DATA8>32768){DATA8=DATA8-65536;}
if(j==0){
DATA10=DATA1;DATA1=0;DATA20=DATA2;DATA2=0;DATA30=DATA3;DATA3=0;DATA40=DATA4;DATA4=0;DATA50=DATA5;DATA5=0;DATA60=DATA6;DATA6=0;DATA70=DATA7;DATA7=0;DATA80=DATA8;DATA8=0;
j=1;//DATA10用于储存清零前的质量
}
else {
DATA1=DATA1-DATA10;DATA2=DATA2-DATA20;DATA3=DATA3-DATA30;DATA4=DATA4-DATA40;DATA5=DATA5-DATA50;DATA6=DATA6-DATA60;DATA7=DATA7-DATA70;DATA8=DATA8-DATA80;
//清零后显示的就是真实质量
}
DATA1=-DATA1;DATA2=-DATA2;DATA3=-DATA3;DATA4=-DATA4;DATA5=-DATA5;DATA6=-DATA6;DATA7=-DATA7;DATA8=-DATA8;
DATA3=(DATA3-809)*0.58927;
Diff_DATA1=DATA1+1571;//
Diff_DATA1=DATA1-591;//
Diff_DATA3=DATA3-1173;//
snprintf(msgJson, 400, dataTemplate, DATA1, DATA2, DATA3,Diff_DATA1,Diff_DATA2,Diff_DATA3,m);
int json_len = strlen(msgJson); //msgJson的长度
msg_buf = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
msg_buf = char(json_len >> 8); //数据第二位是要发送的数据长度的高八位
msg_buf = char(json_len & 0xff); //数据第三位是要发送数据的长度的低八位
memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
msg_buf = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
}
snprintf(msgJson1, 400, dataTemplate1, DATA1, DATA2, DATA3,Diff_DATA1,Diff_DATA2,Diff_DATA3,j);
int json_len1 = strlen(msgJson1); //msgJson的长度
msg_buf1 = char(0x03); //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
msg_buf1 = char(json_len1 >> 8); //数据第二位是要发送的数据长度的高八位
msg_buf1 = char(json_len1 & 0xff); //数据第三位是要发送数据的长度的低八位
memcpy(msg_buf1 + 3, msgJson1, strlen(msgJson1)); //从msg_buf的第四位开始,放入要传的数据msgJson
msg_buf1 = 0; //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
mqttClient.publish("$dp", (uint8_t *)msg_buf1, 3 + strlen(msgJson1)); //发送数据到主题$dp
}
/////////////////////////////////////////////////////////////////////////////////////////
void connectWifi() { //wifi连接函数
Serial.print("Connecting...");
//WiFiManager wifiManager;// 建立WiFiManager对象
//wifiManager.resetSettings();// 清除ESP8266所存储的WiFi连接信息以便测试WiFiManager工作效果
//wifiManager.autoConnect("AutoConnectAP");// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
int ii=0;
while (wifiMulti.run() != WL_CONNECTED) { //等待WiFi连接,成功连接后输出成功信息
delay(1000);
Serial.print("ii++");Serial.print(" ");
}
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及IP
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
}
#define MYADRESS1 0x01//485地址
const unsigned char readcmd1={MYADRESS1,0x03,0x00,0x01,0x00,0x0A,0x94,0x0D}; //读取温湿度指令
signed int strain_1=0,strain_2=0,strain_3=0,strain_4=0,strain_5=0,strain_6=0,strain_7=0,strain_8=0;//湿度
//unsigned int temper2=0;//温度
//unsigned int EC2=0;//电导率
void JXBSInit()
{Serial.begin(9600);}
//unsigned char com_buf; //接收数据缓存变量
unsigned char com_buf; //接收数据缓存变量
bool rec_flag=false;
bool rec_flag1=false;
bool receive_success_flag=false;
bool receive_success_flag1=false;
///////////////////////////////////////////////
void readJXBS1()
{Serial.write(readcmd1,8);//发射数据
}
void JXBSListen1()
{unsigned char com_num = 0;
while (Serial.available())
{char inChar = (char)Serial.read();
com_buf = inChar;
com_num++;
delay(2);
}
if(com_buf==MYADRESS1 && com_buf==0x03)
{strain_1=com_buf*256+com_buf;
strain_2=com_buf*256+com_buf;
strain_3=com_buf*256+com_buf;
strain_4=com_buf*256+com_buf;
strain_5=com_buf*256+com_buf;
strain_6=com_buf*256+com_buf;
strain_7=com_buf*256+com_buf;
strain_8=com_buf*256+com_buf;
}
}
//////////////////////////////////////////////////////////////////////////////////
页:
[1]