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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 787|回复: 0

HX711制作秤

[复制链接]
发表于 2021-9-12 09:04 | 显示全部楼层 |阅读模式

其中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。

  1. #include <ESP8266WiFi.h>                         //esp8266wifi模块库
  2. #include <ESP8266WiFiMulti.h>                    //自动链接最强wifi库
  3. #include <DNSServer.h>                           //WiFiManager库要用的
  4. #include <PubSubClient.h>                        //MQTT协议中的库
  5. #include <Ticker.h>                              //时间记录库
  6. #include <ArduinoJson.h>                         //调用Json数据库
  7. #include <Wire.h>
  8. #include "DHTesp.h"                              //温度DHT11模块函数库
  9. #include "FastLED.h"                             //FastLED库用于调用随机函数库
  10. #include <stdlib.h>                              //接收数据的转化
  11. #include <stdio.h>
  12. #include "HX711.h"
  13. #define debugSerial Serial1



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

  22. #define LED1 D4
  23. #define LED2 D3
  24. #define LVDT_pin A0

  25. /////////////质量传感器/////////////
  26. #define DT  D5 //将DT连D5
  27. #define SCK  D6 //将SCK连D6
  28. HX711 scale(DT, SCK);
  29. float weight1,weight10;
  30. long zero_factor;
  31. float calibration_factor = -201525; // for me this vlaue works just perfect 419640
  32. /////////////////////////////////



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

  38. //////////////////////////////////////////////
  39. int count=0,aa =0,bt=0,ii=0,nn=5,n=20,m=1,j; //一分钟发nn=20
  40. char msgJson[1000];//msgJson数据长度
  41. char msgJson1[1000];//msgJson数据长度
  42. char msg_buf[1000];//
  43. char msg_buf1[1000];//
  44. char dataTemplate[] = "{"rtWeight":%.4f,"m":%d}";
  45. char dataTemplate1[]  = "{"Weight":%.4f}";
  46.                
  47. ////////////////////////////////////////////

  48. void setup() {                                  //里面的函数只执行一次
  49.   debugSerial.begin(9600);
  50. ///////////////////////////////////////////////  
  51.   wifiMulti.addAP("CMCC-PbWq","9bf07201");//添加多个wifi网络
  52.   wifiMulti.addAP("4G-UFI-19DE","seuseucyd");
  53.   wifiMulti.addAP("esp8266","esp82661");
  54.   wifiMulti.addAP("4G-UFI-5FD6","onenetesp8266");
  55.   wifiMulti.addAP("MERCURY_6A1A","datalogging");
  56.   wifiMulti.addAP("4G-CPE-6CAA","12345678");
  57.   wifiMulti.addAP("YWGCJD-WIFI","12345678");
  58. /////////////////////////////////////////////////

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

  65.   WiFi.mode(WIFI_STA);                          //设置wifi模式
  66.   connectWifi();                                //链接Wifi函数
  67.   mqttClient.setServer(mqttServer, mqttPort);   //mqttServer是onenet地址,mqtt接口端口mqttPort
  68.   mqttClient.setCallback(receiveCallback);      //设置MQTT订阅回调,函数
  69.   connectMQTTServer();                          //链接MQTT服务器函数
  70.   ticker.attach(1, tickerCount);  
  71. }

  72. void loop() {                                   //里面的函数无限循环执行
  73.   if (mqttClient.connected()) {                 //如果开发板成功连接服务器                                         
  74.       pubMQTTmsg();                             //调用pubMQTTmsg()函数发送数据到云端
  75.       mqttClient.loop();                        //调用回调函数,接收平台下发的数据
  76.   } else {                                      //如果开发板未能成功连接服务器
  77.     connectMQTTServer();                        //则尝试连接服务器
  78.   }
  79. }

  80. int tickerCount() {count++;}

  81. void connectMQTTServer() {                     //通过MQTT协议链接Onenet
  82.   String clientId = DEVICE_ID;
  83.   String productId = PRODUCT_ID;
  84.   String apiKey = API_KEY;
  85.   if (mqttClient.connect(clientId.c_str(), productId.c_str(), apiKey.c_str())) {//连接MQTT服务器
  86.     subscribeTopic();                          //订阅指定主题
  87.   } else {
  88.     delay(3000);
  89.   }
  90. }
  91.                                                
  92. void subscribeTopic() {//订阅指定主题,主题名称以Taichi-Maker-Sub为前缀,后面添加设备的MAC地址
  93.   String topicString = "temperature"+ WiFi.macAddress();
  94.   char subTopic[topicString.length() + 1];
  95.   strcpy(subTopic, topicString.c_str());       //                                                
  96.   if (mqttClient.subscribe(subTopic)){         //通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  97.   } else {
  98.   }
  99. }
  100. ///////////////////////////////////
  101. void receiveCallback(char* topic, byte* payload, unsigned int length) {//反调函数用于接收平台下发的消息            
  102.   for (int i = 0; i < length; i++){  //按字符一个一个输出
  103.   }
  104.   payload[length] = '\0'; // 添加一个空值使其转化为字符数组
  105.   String payload1=(char *)payload;
  106.   
  107.   m = atoi((char *)payload);//将字符数组转化为整型数组  
  108.   if (payload1 == "31000"){//测试下发数据,如果收到的信息以“1”为开始
  109.     j=0;//用于清零
  110.     } else if (payload1 == "30000"){}
  111.     else { n=nn*m; }   
  112. }                                                                 
  113. ////////////////////////////////////////
  114.                                                                           
  115. void pubMQTTmsg() {                              //onenet数据点上传系统主题
  116.   String topicString = "$dp";
  117.   char publishTopic[topicString.length() + 1];
  118.   strcpy(publishTopic, topicString.c_str());     //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,json数据转换为数组

  119. /////////////////////////////////////////////////////////////
  120. for(ii=1;ii<=n;ii++){                                       
  121. connectMQTTServer();                        //则尝试连接服务器
  122. mqttClient.loop();

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

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

  137.   int json_len = strlen(msgJson);                //msgJson的长度
  138.   msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  139.   msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
  140.   msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
  141.   memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
  142.   msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
  143.   mqttClient.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  144. }
  145. //////////////////////////////////////////////////
  146. snprintf(msgJson1, 100, dataTemplate1,weight1);
  147.   int json_len1 = strlen(msgJson1);                //msgJson的长度
  148.   msg_buf1[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
  149.   msg_buf1[1] = char(json_len1 >> 8);              //数据第二位是要发送的数据长度的高八位
  150.   msg_buf1[2] = char(json_len1 & 0xff);            //数据第三位是要发送数据的长度的低八位
  151.   memcpy(msg_buf1 + 3, msgJson1, strlen(msgJson1)); //从msg_buf的第四位开始,放入要传的数据msgJson
  152.   msg_buf1[3 + strlen(msgJson1)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了  
  153.   mqttClient.publish("$dp", (uint8_t *)msg_buf1, 3 + strlen(msgJson1)); //发送数据到主题$dp
  154.          
  155. }

  156. void connectWifi() {                              //wifi连接函数   
  157.   int ii=0;  
  158.   while (wifiMulti.run() != WL_CONNECTED) {         //等待WiFi连接,成功连接后输出成功信息
  159.   delay(1000);
  160.   }
  161.   Serial.println('\n');                     // WiFi连接成功后
  162.   Serial.print("Connected to ");            // NodeMCU将通过串口监视器输出。
  163.   Serial.println(WiFi.SSID());              // 连接的WiFI名称
  164.   Serial.print("IP address:\t");            // 以及IP
  165.   Serial.println(WiFi.localIP());           // NodeMCU的IP地址  
  166. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:44 , Processed in 0.117422 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表