HX711制作秤-Arduino中文社区 - Powered by Discuz! Archiver

王大富 发表于 2021-9-12 09:04

HX711制作秤


其中HX711的DT连D5,SCK连D6,VCC连3.3v,GND链接GND。传感器的电源正接E+,电源负接E-,信号正接A+,信号负接A-。一般按红黑绿白接E+E-A+A-。
通过onenet平台远程清零,通过下发命令的形式调整数据采集时间,矫正系数需要调整。参考链接:https://www.yiboard.com/thread-1402-1-1.html。

#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 "DHTesp.h"                              //温度DHT11模块函数库
#include "FastLED.h"                           //FastLED库用于调用随机函数库
#include <stdlib.h>                              //接收数据的转化
#include <stdio.h>
#include "HX711.h"
#define debugSerial Serial1



////////////////////////////////////////////////////////
#define PRODUCT_ID "448207"                      //Onenote产品名(需修改)
#define API_KEY    "LHVGqRwz22HsF7h30cOF2bxh=3E="//"CDglbagwPMllUURDk9mO=qKTozU="//产品密钥(需修改)
#define DEVICE_ID"773570218"                   //设备名(需修改),与开发板没有关系,由平台生成的
const char* mqttServer = "183.230.40.39";      //onenet地址(不修改)
const uint16_t mqttPort = 6002;                  //mqtt接口端口(不修改)
#define TOPIC      "ceshitopic1"               //订阅主题
////////////////////////////////////////////////////////////

#define LED1 D4
#define LED2 D3
#define LVDT_pin A0

/////////////质量传感器/////////////
#define DTD5 //将DT连D5
#define SCKD6 //将SCK连D6
HX711 scale(DT, SCK);
float weight1,weight10;
long zero_factor;
float calibration_factor = -201525; // for me this vlaue works just perfect 419640
/////////////////////////////////



ESP8266WiFiMulti wifiMulti;                      //自动链接wifi
DHTesp dht;                                    //温度
WiFiClient wifiClient;                           //
PubSubClient mqttClient(wifiClient);             //
Ticker ticker;                                 //用于记录时间

//////////////////////////////////////////////
int count=0,aa =0,bt=0,ii=0,nn=5,n=20,m=1,j; //一分钟发nn=20
char msgJson;//msgJson数据长度
char msgJson1;//msgJson数据长度
char msg_buf;//
char msg_buf1;//
char dataTemplate[] = "{\"rtWeight\":%.4f,\"m\":%d}";
char dataTemplate1[]= "{\"Weight\":%.4f}";
               
////////////////////////////////////////////

void setup() {                                  //里面的函数只执行一次
debugSerial.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("MERCURY_6A1A","datalogging");
wifiMulti.addAP("4G-CPE-6CAA","12345678");
wifiMulti.addAP("YWGCJD-WIFI","12345678");
/////////////////////////////////////////////////

//////////////////////质量传感器///////////////////////
scale.set_scale();
scale.tare(); //Reset the scale to 0
zero_factor = scale.read_average(); //Get a baseline reading
delay(2000);
//////////////////////////////////////////////////   

WiFi.mode(WIFI_STA);                        //设置wifi模式
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()函数发送数据到云端
      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服务器
    subscribeTopic();                        //订阅指定主题
} else {
    delay(3000);
}
}
                                             
void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
String topicString = "temperature"+ WiFi.macAddress();
char subTopic;
strcpy(subTopic, topicString.c_str());       //                                                
if (mqttClient.subscribe(subTopic)){         //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
} else {
}
}
///////////////////////////////////
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 == "31000"){//测试下发数据,如果收到的信息以“1”为开始
    j=0;//用于清零
    } else if (payload1 == "30000"){}
    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();

////////////////质量传感器///////////////////////
scale.set_scale(calibration_factor); //Adjust to this calibration factor
delay(1000);
weight1 = 1000*scale.get_units(5);//
if(j==0){
weight10=weight1;weight1=0; //DATA10用于储存清零前的质量
j=1;
}
else {
weight1=weight1-weight10;;//清零后显示的就是真实质量
}

weight1=-weight1;
snprintf(msgJson, 100, dataTemplate,weight1,m);//将模拟温湿度数据套入dataTemplate模板中, 生成的字符串传给msgJson
////////////////////////////////////////////////////

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, 100, dataTemplate1,weight1);
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连接函数   
int ii=0;
while (wifiMulti.run() != WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
delay(1000);
}
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地址
}

页: [1]
查看完整版本: HX711制作秤