300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 基于ESP8266 HX711 克级单位称重式压力传感器(接入阿里云物联网平台)—— 看到有

基于ESP8266 HX711 克级单位称重式压力传感器(接入阿里云物联网平台)—— 看到有

时间:2019-01-08 21:55:24

相关推荐

基于ESP8266 HX711 克级单位称重式压力传感器(接入阿里云物联网平台)—— 看到有

手痒做一个

1、参考文档2、完整软件代码2.1 HX711,包括h文件和cpp文件2.2 TM1637,包括h文件和cpp文件2.3 aliyun_mqtt,包括h文件和cpp文件2.4 PubSubClient,包括h文件和cpp文件2.5 Weight_Sensor工程文件

1、参考文档

基于ESP8266称重式压力传感器(接入阿里云物联网平台)

用到材料:

ESP8266NodeMcuHX711数码管(TM1637)

2、完整软件代码

2.1 HX711,包括h文件和cpp文件

HX711.h

#ifndef __HX711__H__#define __HX711__H__#include <Arduino.h>#define HX711_SCK D2#define HX711_DT D1extern void Init_Hx711();extern unsigned long HX711_Read(void);extern long Get_Weight();extern void Get_Maopi();#endif

HX711.cpp

#include "hx711.h"long HX711_Buffer = 0;long Weight_Maopi = 0,Weight_Shiwu = 0;#define GapValue 112//****************************************************//初始化HX711//****************************************************void Init_Hx711(){pinMode(HX711_SCK, OUTPUT);pinMode(HX711_DT, INPUT);}//****************************************************//获取毛皮重量//****************************************************void Get_Maopi(){Weight_Maopi = HX711_Read();} //****************************************************//称重//****************************************************long Get_Weight(){HX711_Buffer = HX711_Read();Weight_Shiwu = HX711_Buffer;Weight_Shiwu = Weight_Shiwu - Weight_Maopi;//获取实物的AD采样数值。Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue); return Weight_Shiwu;}//****************************************************//读取HX711//****************************************************unsigned long HX711_Read(void)//增益128{unsigned long count; unsigned char i;bool Flag = 0;digitalWrite(HX711_DT, HIGH);delayMicroseconds(1);digitalWrite(HX711_SCK, LOW);delayMicroseconds(1);count=0; while(digitalRead(HX711_DT)); for(i=0;i<24;i++){digitalWrite(HX711_SCK, HIGH); delayMicroseconds(1);count=count<<1; digitalWrite(HX711_SCK, LOW); delayMicroseconds(1);if(digitalRead(HX711_DT))count++; } digitalWrite(HX711_SCK, HIGH); count ^= 0x800000;delayMicroseconds(1);digitalWrite(HX711_SCK, LOW); delayMicroseconds(1);return(count);}

2.2 TM1637,包括h文件和cpp文件

TM1637.h 文件

/** TM1637.h* A library for the 4 digit display** Copyright (c) seeed technology inc.* Website : * Author: Frankie.Chu* Create Time: 9 April,* Change Log :** The MIT License (MIT)** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*/#ifndef TM1637_h#define TM1637_h#include <inttypes.h>#include <Arduino.h>//************definitions for TM1637*********************#define ADDR_AUTO 0x40#define ADDR_FIXED 0x44#define STARTADDR 0xc0/**** definitions for the clock point of the digit tube *******/#define POINT_ON 1#define POINT_OFF 0/**************definitions for brightness***********************/#define BRIGHT_DARKEST 0#define BRIGHT_TYPICAL 2#define BRIGHTEST7class TM1637{public:uint8_t Cmd_SetData;uint8_t Cmd_SetAddr;uint8_t Cmd_DispCtrl;boolean _PointFlag;//_PointFlag=1:the clock point onTM1637(uint8_t, uint8_t);void init(void); //To clear the displayint writeByte(int8_t wr_data);//write 8bit data to tm1637void start(void);//send start bitsvoid stop(void); //send stop bitsvoid display(int8_t DispData[]);void display(uint8_t BitAddr,int8_t DispData);void clearDisplay(void);void set(uint8_t = BRIGHT_TYPICAL,uint8_t = 0x40,uint8_t = 0xc0);//To take effect the next time it displays.void point(boolean PointFlag);//whether to light the clock point ":".To take effect the next time it displays.void coding(int8_t DispData[]);int8_t coding(int8_t DispData);void bitDelay(void);private:uint8_t Clkpin;uint8_t Datapin;};#endif

TM1637.cpp文件

/** TM1637.cpp* A library for the 4 digit display** Copyright (c) seeed technology inc.* Website : * Author: Frankie.Chu* Create Time: 9 April,* Change Log :** The MIT License (MIT)** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated documentation files (the "Software"), to deal* in the Software without restriction, including without limitation the rights* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell* copies of the Software, and to permit persons to whom the Software is* furnished to do so, subject to the following conditions:** The above copyright notice and this permission notice shall be included in* all copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN* THE SOFTWARE.*/#include "TM1637.h"#include <Arduino.h>static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,FTM1637::TM1637(uint8_t Clk, uint8_t Data){Clkpin = Clk;Datapin = Data;pinMode(Clkpin,OUTPUT);pinMode(Datapin,OUTPUT);}void TM1637::init(void){clearDisplay();}int TM1637::writeByte(int8_t wr_data){uint8_t i,count1;for(i=0;i<8;i++) //sent 8bit data{digitalWrite(Clkpin,LOW);if(wr_data & 0x01)digitalWrite(Datapin,HIGH);//LSB firstelse digitalWrite(Datapin,LOW);wr_data >>= 1;digitalWrite(Clkpin,HIGH);}digitalWrite(Clkpin,LOW); //wait for the ACKdigitalWrite(Datapin,HIGH);digitalWrite(Clkpin,HIGH);pinMode(Datapin,INPUT);bitDelay();uint8_t ack = digitalRead(Datapin);if (ack == 0) {pinMode(Datapin,OUTPUT);digitalWrite(Datapin,LOW);}bitDelay();pinMode(Datapin,OUTPUT);bitDelay();return ack;}//send start signal to TM1637void TM1637::start(void){digitalWrite(Clkpin,HIGH);//send start signal to TM1637digitalWrite(Datapin,HIGH);digitalWrite(Datapin,LOW);digitalWrite(Clkpin,LOW);}//End of transmissionvoid TM1637::stop(void){digitalWrite(Clkpin,LOW);digitalWrite(Datapin,LOW);digitalWrite(Clkpin,HIGH);digitalWrite(Datapin,HIGH);}//display function.Write to full-screen.void TM1637::display(int8_t DispData[]){int8_t SegData[4];uint8_t i;for(i = 0;i < 4;i ++){SegData[i] = DispData[i];}coding(SegData);start();//start signal sent to TM1637 from MCUwriteByte(ADDR_AUTO);//stop(); //start();//writeByte(Cmd_SetAddr);//for(i=0;i < 4;i ++){writeByte(SegData[i]); //}stop(); //start();//writeByte(Cmd_DispCtrl);//stop(); //}//******************************************void TM1637::display(uint8_t BitAddr,int8_t DispData){int8_t SegData;SegData = coding(DispData);start();//start signal sent to TM1637 from MCUwriteByte(ADDR_FIXED);//stop(); //start();//writeByte(BitAddr|0xc0);//writeByte(SegData);//stop(); //start();//writeByte(Cmd_DispCtrl);//stop(); //}void TM1637::clearDisplay(void){display(0x00,0x7f);display(0x01,0x7f);display(0x02,0x7f);display(0x03,0x7f);}//To take effect the next time it displays.void TM1637::set(uint8_t brightness,uint8_t SetData,uint8_t SetAddr){Cmd_SetData = SetData;Cmd_SetAddr = SetAddr;Cmd_DispCtrl = 0x88 + brightness;//Set the brightness and it takes effect the next time it displays.}//Whether to light the clock point ":".//To take effect the next time it displays.void TM1637::point(boolean PointFlag){_PointFlag = PointFlag;}void TM1637::coding(int8_t DispData[]){uint8_t PointData;if(_PointFlag == POINT_ON)PointData = 0x80;else PointData = 0;for(uint8_t i = 0;i < 4;i ++){if(DispData[i] == 0x7f)DispData[i] = 0x00;else DispData[i] = TubeTab[DispData[i]] + PointData;}}int8_t TM1637::coding(int8_t DispData){uint8_t PointData;if(_PointFlag == POINT_ON)PointData = 0x80;else PointData = 0;if(DispData == 0x7f) DispData = 0x00 + PointData;//The bit digital tube offelse DispData = TubeTab[DispData] + PointData;return DispData;}void TM1637::bitDelay(void){delayMicroseconds(50);}

2.3 aliyun_mqtt,包括h文件和cpp文件

aliyun_mqtt.h

/*Aliyun_mqtt.h - Library for connect to Aliyun MQTT server with authentication byproduct key, device name and device secret./help/product/30520.htm*/#ifndef _ALIYUN_MATT_H#define _ALIYUN_MATT_H#include <Arduino.h>#include "PubSubClient.h"/*** Connect to Alibaba Cloud MQTT server. In connection process, it will try several times for* possible network failure. For authentication issue, it will return false at once.** @param mqttClient: Caller provide a valid PubSubClient object (initialized with network client).* @param productKey: Product Key, get from Alibaba Cloud Link Platform.* @param deviceName: Device Name, get from Alibaba Cloud Link Platform.* @param deviceSecret: Device Secret, get from Alibaba Cloud Link Platform.** @param region: Optional region, use "cn-shanghai" as default. It can be "us-west-1",*"ap-southeast-1" etc. Refer to Alibaba Cloud Link Platform.*** @return true if connect succeed, otherwise false.*/extern "C" bool connectAliyunMQTT(PubSubClient &mqttClient,const char *productKey,const char *deviceName,const char *deviceSecret,const char *region = "cn-shanghai");/*** Two new added APIs are designed for devices with limited resource like Arduino UNO.* Since it is hard to calculate HMAC256 on such devices, the calculation can be done externally.** These two APIs should be used together with external HMAC256 calculation tools, e.g.* /encrypt?type=2* They can be used together to replace connectAliyunMQTT on resource-limited devices.*//*** This API should be called in setup() phase to init all MQTT parameters. Since HMAC256* calculation is executed extenrally, a fixed timestamp string should be provided, such* as "23668" etc. The same timestamp string is also used to calculate HMAC256 result.** Other params are similar to them in connectAliyunMQTT.*/extern "C" void mqttPrepare(const char *timestamp,const char *productKey,const char *deviceName,const char *deviceSecret,const char *region = "cn-shanghai");/*** Use tools here to calculate HMAC256: /encrypt?type=2* The calculated result should be defined as constants and passed when call this function.*/extern "C" bool connectAliyunMQTTWithPassword(PubSubClient &mqttClient, const char *password);#endif

aliyun_mqtt.cpp

/*Aliyun_mqtt.h - Library for connect to Aliyun MQTT server.*/#include "aliyun_mqtt.h"#include "SHA256.h"#define MQTT_PORT 1883#define SHA256HMAC_SIZE 32// Verify tool: /encrypt?type=2static String hmac256(const String &signcontent, const String &ds){byte hashCode[SHA256HMAC_SIZE];SHA256 sha256;const char *key = ds.c_str();size_t keySize = ds.length();sha256.resetHMAC(key, keySize);sha256.update((const byte *)signcontent.c_str(), signcontent.length());sha256.finalizeHMAC(key, keySize, hashCode, sizeof(hashCode));String sign = "";for (byte i = 0; i < SHA256HMAC_SIZE; ++i){sign += "0123456789ABCDEF"[hashCode[i] >> 4];sign += "0123456789ABCDEF"[hashCode[i] & 0xf];}return sign;}static String mqttBroker;static String mqttClientID;static String mqttUserName;static String mqttPassword;// call this function oncevoid mqttPrepare(const char *timestamp,const char *productKey,const char *deviceName,const char *deviceSecret,const char *region){mqttBroker = productKey;mqttBroker += ".iot-as-mqtt.";mqttBroker += String(region);mqttBroker += ".";// Serial.println(mqttBroker);mqttUserName = deviceName;mqttUserName += '&';mqttUserName += productKey;// Serial.println(mqttUserName);mqttClientID = deviceName; // device name used as client IDmqttClientID += "|securemode=3,signmethod=hmacsha256,timestamp=";mqttClientID += timestamp;mqttClientID += '|';// Serial.println(mqttClientID);}bool connectAliyunMQTTWithPassword(PubSubClient &mqttClient, const char *password){mqttClient.setServer(mqttBroker.c_str(), MQTT_PORT);byte mqttConnectTryCnt = 5;while (!mqttClient.connected() && mqttConnectTryCnt > 0){Serial.println("Connecting to MQTT Server ...");if (mqttClient.connect(mqttClientID.c_str(), mqttUserName.c_str(), password)){Serial.println("MQTT Connected!");return true;}else{byte errCode = mqttClient.state();Serial.print("MQTT connect failed, error code:");Serial.println(errCode);if (errCode == MQTT_CONNECT_BAD_PROTOCOL || errCode == MQTT_CONNECT_BAD_CLIENT_ID || errCode == MQTT_CONNECT_BAD_CREDENTIALS || errCode == MQTT_CONNECT_UNAUTHORIZED){Serial.println("No need to try again.");break; // No need to try again for these situation}delay(5000);}mqttConnectTryCnt -= 1;}return false;}bool connectAliyunMQTT(PubSubClient &mqttClient,const char *productKey,const char *deviceName,const char *deviceSecret,const char *region){String timestamp = String(millis());mqttPrepare(timestamp.c_str(), productKey, deviceName, deviceSecret, region);// Generate MQTT Password, use deviceName as clientIDString signcontent = "clientId";signcontent += deviceName;signcontent += "deviceName";signcontent += deviceName;signcontent += "productKey";signcontent += productKey;signcontent += "timestamp";signcontent += timestamp;String mqttPassword = hmac256(signcontent, deviceSecret);// Serial.print("HMAC256 data: ");// Serial.println(signcontent);// Serial.print("HMAC256 key: ");// Serial.println(deviceSecret);// Serial.println(mqttPassword);return connectAliyunMQTTWithPassword(mqttClient, mqttPassword.c_str());}

2.4 PubSubClient,包括h文件和cpp文件

PubSubClient.h

/*PubSubClient.h - A simple client for MQTT.Nick O'Leary*/#ifndef PubSubClient_h#define PubSubClient_h#include <Arduino.h>#include "IPAddress.h"#include "Client.h"#include "Stream.h"#define MQTT_VERSION_3_13#define MQTT_VERSION_3_1_1 4// MQTT_VERSION : Pick the version//#define MQTT_VERSION MQTT_VERSION_3_1#ifndef MQTT_VERSION#define MQTT_VERSION MQTT_VERSION_3_1_1#endif// MQTT_MAX_PACKET_SIZE : Maximum packet size#ifndef MQTT_MAX_PACKET_SIZE#define MQTT_MAX_PACKET_SIZE 1024#endif// MQTT_KEEPALIVE : keepAlive interval in Seconds#ifndef MQTT_KEEPALIVE#define MQTT_KEEPALIVE 300#endif// MQTT_SOCKET_TIMEOUT: socket timeout interval in Seconds#ifndef MQTT_SOCKET_TIMEOUT#define MQTT_SOCKET_TIMEOUT 60#endif// MQTT_MAX_TRANSFER_SIZE : limit how much data is passed to the network client// in each write call. Needed for the Arduino Wifi Shield. Leave undefined to// pass the entire MQTT packet in each write call.//#define MQTT_MAX_TRANSFER_SIZE 80// Possible values for client.state()#define MQTT_CONNECTION_TIMEOUT-4#define MQTT_CONNECTION_LOST -3#define MQTT_CONNECT_FAILED -2#define MQTT_DISCONNECTED -1#define MQTT_CONNECTED0#define MQTT_CONNECT_BAD_PROTOCOL 1#define MQTT_CONNECT_BAD_CLIENT_ID 2#define MQTT_CONNECT_UNAVAILABLE3#define MQTT_CONNECT_BAD_CREDENTIALS 4#define MQTT_CONNECT_UNAUTHORIZED 5#define MQTTCONNECT1 << 4 // Client request to connect to Server#define MQTTCONNACK2 << 4 // Connect Acknowledgment#define MQTTPUBLISH3 << 4 // Publish message#define MQTTPUBACK4 << 4 // Publish Acknowledgment#define MQTTPUBREC5 << 4 // Publish Received (assured delivery part 1)#define MQTTPUBREL6 << 4 // Publish Release (assured delivery part 2)#define MQTTPUBCOMP7 << 4 // Publish Complete (assured delivery part 3)#define MQTTSUBSCRIBE 8 << 4 // Client Subscribe request#define MQTTSUBACK9 << 4 // Subscribe Acknowledgment#define MQTTUNSUBSCRIBE 10 << 4 // Client Unsubscribe request#define MQTTUNSUBACK 11 << 4 // Unsubscribe Acknowledgment#define MQTTPINGREQ12 << 4 // PING Request#define MQTTPINGRESP 13 << 4 // PING Response#define MQTTDISCONNECT 14 << 4 // Client is Disconnecting#define MQTTReserved 15 << 4 // Reserved#define MQTTQOS0 (0 << 1)#define MQTTQOS1 (1 << 1)#define MQTTQOS2 (2 << 1)// Maximum size of fixed header and variable length size header#define MQTT_MAX_HEADER_SIZE 5#if defined(ESP8266) || defined(ESP32)#include <functional>#define MQTT_CALLBACK_SIGNATURE std::function<void(char*, uint8_t*, unsigned int)> callback#else#define MQTT_CALLBACK_SIGNATURE void (*callback)(char*, uint8_t*, unsigned int)#endif#define CHECK_STRING_LENGTH(l,s) if (l+2+strlen(s) > MQTT_MAX_PACKET_SIZE) {_client->stop();return false;}class PubSubClient : public Print {private:Client* _client;uint8_t buffer[MQTT_MAX_PACKET_SIZE];uint16_t nextMsgId;unsigned long lastOutActivity;unsigned long lastInActivity;bool pingOutstanding;MQTT_CALLBACK_SIGNATURE;uint16_t readPacket(uint8_t*);boolean readByte(uint8_t * result);boolean readByte(uint8_t * result, uint16_t * index);boolean write(uint8_t header, uint8_t* buf, uint16_t length);uint16_t writeString(const char* string, uint8_t* buf, uint16_t pos);// Build up the header ready to send// Returns the size of the header// Note: the header is built at the end of the first MQTT_MAX_HEADER_SIZE bytes, so will start// (MQTT_MAX_HEADER_SIZE - <returned size>) bytes into the buffersize_t buildHeader(uint8_t header, uint8_t* buf, uint16_t length);IPAddress ip;const char* domain;uint16_t port;Stream* stream;int _state;public:PubSubClient();PubSubClient(Client& client);PubSubClient(IPAddress, uint16_t, Client& client);PubSubClient(IPAddress, uint16_t, Client& client, Stream&);PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);PubSubClient(IPAddress, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);PubSubClient(uint8_t *, uint16_t, Client& client);PubSubClient(uint8_t *, uint16_t, Client& client, Stream&);PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);PubSubClient(uint8_t *, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);PubSubClient(const char*, uint16_t, Client& client);PubSubClient(const char*, uint16_t, Client& client, Stream&);PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client);PubSubClient(const char*, uint16_t, MQTT_CALLBACK_SIGNATURE,Client& client, Stream&);PubSubClient& setServer(IPAddress ip, uint16_t port);PubSubClient& setServer(uint8_t * ip, uint16_t port);PubSubClient& setServer(const char * domain, uint16_t port);PubSubClient& setCallback(MQTT_CALLBACK_SIGNATURE);PubSubClient& setClient(Client& client);PubSubClient& setStream(Stream& stream);boolean connect(const char* id);boolean connect(const char* id, const char* user, const char* pass);boolean connect(const char* id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage);boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage);boolean connect(const char* id, const char* user, const char* pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage, boolean cleanSession);void disconnect();boolean publish(const char* topic, const char* payload);boolean publish(const char* topic, const char* payload, boolean retained);boolean publish(const char* topic, const uint8_t * payload, unsigned int plength);boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);boolean publish_P(const char* topic, const char* payload, boolean retained);boolean publish_P(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);// Start to publish a message.// This API:// beginPublish(...)// one or more calls to write(...)// endPublish()// Allows for arbitrarily large payloads to be sent without them having to be copied into// a new buffer and held in memory at one time// Returns 1 if the message was started successfully, 0 if there was an errorboolean beginPublish(const char* topic, unsigned int plength, boolean retained);// Finish off this publish message (started with beginPublish)// Returns 1 if the packet was sent successfully, 0 if there was an errorint endPublish();// Write a single byte of payload (only to be used with beginPublish/endPublish)virtual size_t write(uint8_t);// Write size bytes from buffer into the payload (only to be used with beginPublish/endPublish)// Returns the number of bytes writtenvirtual size_t write(const uint8_t *buffer, size_t size);boolean subscribe(const char* topic);boolean subscribe(const char* topic, uint8_t qos);boolean unsubscribe(const char* topic);boolean loop();boolean connected();int state();};#endif

PubSubClient.cpp

/*PubSubClient.cpp - A simple client for MQTT.Nick O'Leary*/#include "PubSubClient.h"#include "Arduino.h"PubSubClient::PubSubClient() {this->_state = MQTT_DISCONNECTED;this->_client = NULL;this->stream = NULL;setCallback(NULL);}PubSubClient::PubSubClient(Client& client) {this->_state = MQTT_DISCONNECTED;setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(IPAddress addr, uint16_t port, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(addr, port);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(IPAddress addr, uint16_t port, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(addr,port);setClient(client);setStream(stream);}PubSubClient::PubSubClient(IPAddress addr, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(addr, port);setCallback(callback);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(IPAddress addr, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(addr,port);setCallback(callback);setClient(client);setStream(stream);}PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(ip, port);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(ip,port);setClient(client);setStream(stream);}PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(ip, port);setCallback(callback);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(uint8_t *ip, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(ip,port);setCallback(callback);setClient(client);setStream(stream);}PubSubClient::PubSubClient(const char* domain, uint16_t port, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(domain,port);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(const char* domain, uint16_t port, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(domain,port);setClient(client);setStream(stream);}PubSubClient::PubSubClient(const char* domain, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client) {this->_state = MQTT_DISCONNECTED;setServer(domain,port);setCallback(callback);setClient(client);this->stream = NULL;}PubSubClient::PubSubClient(const char* domain, uint16_t port, MQTT_CALLBACK_SIGNATURE, Client& client, Stream& stream) {this->_state = MQTT_DISCONNECTED;setServer(domain,port);setCallback(callback);setClient(client);setStream(stream);}boolean PubSubClient::connect(const char *id) {return connect(id,NULL,NULL,0,0,0,0,1);}boolean PubSubClient::connect(const char *id, const char *user, const char *pass) {return connect(id,user,pass,0,0,0,0,1);}boolean PubSubClient::connect(const char *id, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage) {return connect(id,NULL,NULL,willTopic,willQos,willRetain,willMessage,1);}boolean PubSubClient::connect(const char *id, const char *user, const char *pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage) {return connect(id,user,pass,willTopic,willQos,willRetain,willMessage,1);}boolean PubSubClient::connect(const char *id, const char *user, const char *pass, const char* willTopic, uint8_t willQos, boolean willRetain, const char* willMessage, boolean cleanSession) {if (!connected()) {int result = 0;if (domain != NULL) {result = _client->connect(this->domain, this->port);} else {result = _client->connect(this->ip, this->port);}if (result == 1) {nextMsgId = 1;// Leave room in the buffer for header and variable length fielduint16_t length = MQTT_MAX_HEADER_SIZE;unsigned int j;#if MQTT_VERSION == MQTT_VERSION_3_1uint8_t d[9] = {0x00,0x06,'M','Q','I','s','d','p', MQTT_VERSION};#define MQTT_HEADER_VERSION_LENGTH 9#elif MQTT_VERSION == MQTT_VERSION_3_1_1uint8_t d[7] = {0x00,0x04,'M','Q','T','T',MQTT_VERSION};#define MQTT_HEADER_VERSION_LENGTH 7#endiffor (j = 0;j<MQTT_HEADER_VERSION_LENGTH;j++) {buffer[length++] = d[j];}uint8_t v;if (willTopic) {v = 0x04|(willQos<<3)|(willRetain<<5);} else {v = 0x00;}if (cleanSession) {v = v|0x02;}if(user != NULL) {v = v|0x80;if(pass != NULL) {v = v|(0x80>>1);}}buffer[length++] = v;buffer[length++] = ((MQTT_KEEPALIVE) >> 8);buffer[length++] = ((MQTT_KEEPALIVE) & 0xFF);CHECK_STRING_LENGTH(length,id)length = writeString(id,buffer,length);if (willTopic) {CHECK_STRING_LENGTH(length,willTopic)length = writeString(willTopic,buffer,length);CHECK_STRING_LENGTH(length,willMessage)length = writeString(willMessage,buffer,length);}if(user != NULL) {CHECK_STRING_LENGTH(length,user)length = writeString(user,buffer,length);if(pass != NULL) {CHECK_STRING_LENGTH(length,pass)length = writeString(pass,buffer,length);}}write(MQTTCONNECT,buffer,length-MQTT_MAX_HEADER_SIZE);lastInActivity = lastOutActivity = millis();while (!_client->available()) {unsigned long t = millis();if (t-lastInActivity >= ((int32_t) MQTT_SOCKET_TIMEOUT*1000UL)) {_state = MQTT_CONNECTION_TIMEOUT;_client->stop();return false;}}uint8_t llen;uint16_t len = readPacket(&llen);if (len == 4) {if (buffer[3] == 0) {lastInActivity = millis();pingOutstanding = false;_state = MQTT_CONNECTED;return true;} else {_state = buffer[3];}}_client->stop();} else {_state = MQTT_CONNECT_FAILED;}return false;}return true;}// reads a byte into resultboolean PubSubClient::readByte(uint8_t * result) {uint32_t previousMillis = millis();while(!_client->available()) {yield();uint32_t currentMillis = millis();if(currentMillis - previousMillis >= ((int32_t) MQTT_SOCKET_TIMEOUT * 1000)){return false;}}*result = _client->read();return true;}// reads a byte into result[*index] and increments indexboolean PubSubClient::readByte(uint8_t * result, uint16_t * index){uint16_t current_index = *index;uint8_t * write_address = &(result[current_index]);if(readByte(write_address)){*index = current_index + 1;return true;}return false;}uint16_t PubSubClient::readPacket(uint8_t* lengthLength) {uint16_t len = 0;if(!readByte(buffer, &len)) return 0;bool isPublish = (buffer[0]&0xF0) == MQTTPUBLISH;uint32_t multiplier = 1;uint16_t length = 0;uint8_t digit = 0;uint16_t skip = 0;uint8_t start = 0;do {if (len == 5) {// Invalid remaining length encoding - kill the connection_state = MQTT_DISCONNECTED;_client->stop();return 0;}if(!readByte(&digit)) return 0;buffer[len++] = digit;length += (digit & 127) * multiplier;multiplier *= 128;} while ((digit & 128) != 0);*lengthLength = len-1;if (isPublish) {// Read in topic length to calculate bytes to skip over for Stream writingif(!readByte(buffer, &len)) return 0;if(!readByte(buffer, &len)) return 0;skip = (buffer[*lengthLength+1]<<8)+buffer[*lengthLength+2];start = 2;if (buffer[0]&MQTTQOS1) {// skip message idskip += 2;}}for (uint16_t i = start;i<length;i++) {if(!readByte(&digit)) return 0;if (this->stream) {if (isPublish && len-*lengthLength-2>skip) {this->stream->write(digit);}}if (len < MQTT_MAX_PACKET_SIZE) {buffer[len] = digit;}len++;}if (!this->stream && len > MQTT_MAX_PACKET_SIZE) {len = 0; // This will cause the packet to be ignored.}return len;}boolean PubSubClient::loop() {if (connected()) {unsigned long t = millis();if ((t - lastInActivity > MQTT_KEEPALIVE*1000UL) || (t - lastOutActivity > MQTT_KEEPALIVE*1000UL)) {if (pingOutstanding) {this->_state = MQTT_CONNECTION_TIMEOUT;_client->stop();return false;} else {buffer[0] = MQTTPINGREQ;buffer[1] = 0;_client->write(buffer,2);lastOutActivity = t;lastInActivity = t;pingOutstanding = true;}}if (_client->available()) {uint8_t llen;uint16_t len = readPacket(&llen);uint16_t msgId = 0;uint8_t *payload;if (len > 0) {lastInActivity = t;uint8_t type = buffer[0]&0xF0;if (type == MQTTPUBLISH) {if (callback) {uint16_t tl = (buffer[llen+1]<<8)+buffer[llen+2]; /* topic length in bytes */memmove(buffer+llen+2,buffer+llen+3,tl); /* move topic inside buffer 1 byte to front */buffer[llen+2+tl] = 0; /* end the topic as a 'C' string with \x00 */char *topic = (char*) buffer+llen+2;// msgId only present for QOS>0if ((buffer[0]&0x06) == MQTTQOS1) {msgId = (buffer[llen+3+tl]<<8)+buffer[llen+3+tl+1];payload = buffer+llen+3+tl+2;callback(topic,payload,len-llen-3-tl-2);buffer[0] = MQTTPUBACK;buffer[1] = 2;buffer[2] = (msgId >> 8);buffer[3] = (msgId & 0xFF);_client->write(buffer,4);lastOutActivity = t;} else {payload = buffer+llen+3+tl;callback(topic,payload,len-llen-3-tl);}}} else if (type == MQTTPINGREQ) {buffer[0] = MQTTPINGRESP;buffer[1] = 0;_client->write(buffer,2);} else if (type == MQTTPINGRESP) {pingOutstanding = false;}} else if (!connected()) {// readPacket has closed the connectionreturn false;}}return true;}return false;}boolean PubSubClient::publish(const char* topic, const char* payload) {return publish(topic,(const uint8_t*)payload,strlen(payload),false);}boolean PubSubClient::publish(const char* topic, const char* payload, boolean retained) {return publish(topic,(const uint8_t*)payload,strlen(payload),retained);}boolean PubSubClient::publish(const char* topic, const uint8_t* payload, unsigned int plength) {return publish(topic, payload, plength, false);}boolean PubSubClient::publish(const char* topic, const uint8_t* payload, unsigned int plength, boolean retained) {if (connected()) {if (MQTT_MAX_PACKET_SIZE < MQTT_MAX_HEADER_SIZE + 2+strlen(topic) + plength) {// Too longreturn false;}// Leave room in the buffer for header and variable length fielduint16_t length = MQTT_MAX_HEADER_SIZE;length = writeString(topic,buffer,length);uint16_t i;for (i=0;i<plength;i++) {buffer[length++] = payload[i];}uint8_t header = MQTTPUBLISH;if (retained) {header |= 1;}return write(header,buffer,length-MQTT_MAX_HEADER_SIZE);}return false;}boolean PubSubClient::publish_P(const char* topic, const char* payload, boolean retained) {return publish_P(topic, (const uint8_t*)payload, strlen(payload), retained);}boolean PubSubClient::publish_P(const char* topic, const uint8_t* payload, unsigned int plength, boolean retained) {uint8_t llen = 0;uint8_t digit;unsigned int rc = 0;uint16_t tlen;unsigned int pos = 0;unsigned int i;uint8_t header;unsigned int len;if (!connected()) {return false;}tlen = strlen(topic);header = MQTTPUBLISH;if (retained) {header |= 1;}buffer[pos++] = header;len = plength + 2 + tlen;do {digit = len % 128;len = len / 128;if (len > 0) {digit |= 0x80;}buffer[pos++] = digit;llen++;} while(len>0);pos = writeString(topic,buffer,pos);rc += _client->write(buffer,pos);for (i=0;i<plength;i++) {rc += _client->write((char)pgm_read_byte_near(payload + i));}lastOutActivity = millis();return rc == tlen + 4 + plength;}boolean PubSubClient::beginPublish(const char* topic, unsigned int plength, boolean retained) {if (connected()) {// Send the header and variable length fielduint16_t length = MQTT_MAX_HEADER_SIZE;length = writeString(topic,buffer,length);uint16_t i;uint8_t header = MQTTPUBLISH;if (retained) {header |= 1;}size_t hlen = buildHeader(header, buffer, plength+length-MQTT_MAX_HEADER_SIZE);uint16_t rc = _client->write(buffer+(MQTT_MAX_HEADER_SIZE-hlen),length-(MQTT_MAX_HEADER_SIZE-hlen));lastOutActivity = millis();return (rc == (length-(MQTT_MAX_HEADER_SIZE-hlen)));}return false;}int PubSubClient::endPublish() {return 1;}size_t PubSubClient::write(uint8_t data) {lastOutActivity = millis();return _client->write(data);}size_t PubSubClient::write(const uint8_t *buffer, size_t size) {lastOutActivity = millis();return _client->write(buffer,size);}size_t PubSubClient::buildHeader(uint8_t header, uint8_t* buf, uint16_t length) {uint8_t lenBuf[4];uint8_t llen = 0;uint8_t digit;uint8_t pos = 0;uint16_t len = length;do {digit = len % 128;len = len / 128;if (len > 0) {digit |= 0x80;}lenBuf[pos++] = digit;llen++;} while(len>0);buf[4-llen] = header;for (int i=0;i<llen;i++) {buf[MQTT_MAX_HEADER_SIZE-llen+i] = lenBuf[i];}return llen+1; // Full header size is variable length bit plus the 1-byte fixed header}boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) {uint16_t rc;uint8_t hlen = buildHeader(header, buf, length);#ifdef MQTT_MAX_TRANSFER_SIZEuint8_t* writeBuf = buf+(MQTT_MAX_HEADER_SIZE-hlen);uint16_t bytesRemaining = length+hlen; //Match the length typeuint8_t bytesToWrite;boolean result = true;while((bytesRemaining > 0) && result) {bytesToWrite = (bytesRemaining > MQTT_MAX_TRANSFER_SIZE)?MQTT_MAX_TRANSFER_SIZE:bytesRemaining;rc = _client->write(writeBuf,bytesToWrite);result = (rc == bytesToWrite);bytesRemaining -= rc;writeBuf += rc;}return result;#elserc = _client->write(buf+(MQTT_MAX_HEADER_SIZE-hlen),length+hlen);lastOutActivity = millis();return (rc == hlen+length);#endif}boolean PubSubClient::subscribe(const char* topic) {return subscribe(topic, 0);}boolean PubSubClient::subscribe(const char* topic, uint8_t qos) {if (qos > 1) {return false;}if (MQTT_MAX_PACKET_SIZE < 9 + strlen(topic)) {// Too longreturn false;}if (connected()) {// Leave room in the buffer for header and variable length fielduint16_t length = MQTT_MAX_HEADER_SIZE;nextMsgId++;if (nextMsgId == 0) {nextMsgId = 1;}buffer[length++] = (nextMsgId >> 8);buffer[length++] = (nextMsgId & 0xFF);length = writeString((char*)topic, buffer,length);buffer[length++] = qos;return write(MQTTSUBSCRIBE|MQTTQOS1,buffer,length-MQTT_MAX_HEADER_SIZE);}return false;}boolean PubSubClient::unsubscribe(const char* topic) {if (MQTT_MAX_PACKET_SIZE < 9 + strlen(topic)) {// Too longreturn false;}if (connected()) {uint16_t length = MQTT_MAX_HEADER_SIZE;nextMsgId++;if (nextMsgId == 0) {nextMsgId = 1;}buffer[length++] = (nextMsgId >> 8);buffer[length++] = (nextMsgId & 0xFF);length = writeString(topic, buffer,length);return write(MQTTUNSUBSCRIBE|MQTTQOS1,buffer,length-MQTT_MAX_HEADER_SIZE);}return false;}void PubSubClient::disconnect() {buffer[0] = MQTTDISCONNECT;buffer[1] = 0;_client->write(buffer,2);_state = MQTT_DISCONNECTED;_client->flush();_client->stop();lastInActivity = lastOutActivity = millis();}uint16_t PubSubClient::writeString(const char* string, uint8_t* buf, uint16_t pos) {const char* idp = string;uint16_t i = 0;pos += 2;while (*idp) {buf[pos++] = *idp++;i++;}buf[pos-i-2] = (i >> 8);buf[pos-i-1] = (i & 0xFF);return pos;}boolean PubSubClient::connected() {boolean rc;if (_client == NULL ) {rc = false;} else {rc = (int)_client->connected();if (!rc) {if (this->_state == MQTT_CONNECTED) {this->_state = MQTT_CONNECTION_LOST;_client->flush();_client->stop();}}}return rc;}PubSubClient& PubSubClient::setServer(uint8_t * ip, uint16_t port) {IPAddress addr(ip[0],ip[1],ip[2],ip[3]);return setServer(addr,port);}PubSubClient& PubSubClient::setServer(IPAddress ip, uint16_t port) {this->ip = ip;this->port = port;this->domain = NULL;return *this;}PubSubClient& PubSubClient::setServer(const char * domain, uint16_t port) {this->domain = domain;this->port = port;return *this;}PubSubClient& PubSubClient::setCallback(MQTT_CALLBACK_SIGNATURE) {this->callback = callback;return *this;}PubSubClient& PubSubClient::setClient(Client& client){this->_client = &client;return *this;}PubSubClient& PubSubClient::setStream(Stream& stream){this->stream = &stream;return *this;}int PubSubClient::state() {return this->_state;}

2.5 Weight_Sensor工程文件

#include "TM1637.h"#include "HX711.h"#include "PubSubClient.h"#include <ESP8266WiFi.h>#include <ArduinoJson.h>#include "aliyun_mqtt.h"long Weight = 0;TM1637 tm1637(D6,D7);// D6 对应CLK D7 对应DIO/*------------------------------------------MQTT协议与阿里云-----------------------------------------*///初始化次态int redLedState0 = 0;//初始化现态int last0 = 0;#define LED_BUILTIN D8//上云时间现态unsigned long lastSend = 0;//你的wifi#define WIFI_SSID "TP-LINK_xxxxxxxx" // WiFi账号密码,更改成自己的#define WIFI_PASSWD "xxxxxxxxx" // WiFi密码,更改成自己的//阿里云三元组#define PRODUCT_KEY "xxxxxx" // 更改成自己的#define DEVICE_NAME "xxxxx" // 更改成自己的#define DEVICE_SECRET "xxxxxx" // 更改成自己的//订阅和发布时所需的主题#define ALINK_BODY_FORMAT "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"#define ALINK_TOPIC_PROP_POST "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"#define ALINK_TOPIC_PROP_POSTRSP "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post_reply"#define ALINK_TOPIC_PROP_SET "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/service/property/set"#define ALINK_METHOD_PROP_POST "thing.event.property.post"//创建WiFiClient实例WiFiClient espClient;//创建MqttClient实例PubSubClient mqttClient(espClient);//连接Wifivoid initWifi(const char *ssid, const char *password){WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){Serial.println("WiFi does not connect, try again ...");delay(500);}Serial.println("Wifi is connected.");Serial.println("IP address: ");Serial.println(WiFi.localIP());}//监听云端下发指令并处理 void callback(char *topic, byte *payload, unsigned int length){Serial.println();Serial.println();Serial.print("Message arrived [");Serial.print(topic);Serial.print("] ");Serial.println();payload[length] = '\0';Serial.println((char *)payload);//const char *payload = "{"method":"thing.service.property.set","id":"282860794","params":{"LightSwitch":1},"version":"1.0.0"}"if (strstr(topic, ALINK_TOPIC_PROP_SET)){//json解析payloadStaticJsonDocument<400> doc;// Deserialize the JSON documentDeserializationError error = deserializeJson(doc, payload);// Test if parsing succeeds.if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.c_str());return ;}Serial.println("parseObject() success");//redLedState0 = json解析后的"S_D0"的值redLedState0 = doc["params"]["S_D0"];Serial.print(redLedState0);Serial.println(" set sucess");Serial.println();Serial.print("LED_BUILTIN");Serial.println(redLedState0);digitalWrite(LED_BUILTIN, redLedState0);}}//连接Mqtt订阅属性设置Topicvoid mqttCheckConnect(){Serial.println("mqttCheckConnect");bool connected = connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);if (connected){Serial.println("MQTT connect succeed!");//订阅属性设置TopicmqttClient.subscribe(ALINK_TOPIC_PROP_SET); Serial.println("subscribe done");}}// 上报属性Topic数据void mqttIntervalPost(){Serial.println("mqttIntervalPost");char param[100];char jsonBuf[500];sprintf(param, "{\"S_D0\":%d,\"Weight\":%f}", digitalRead(LED_BUILTIN),float(Weight/1000*-1));sprintf(jsonBuf, ALINK_BODY_FORMAT, ALINK_METHOD_PROP_POST, param);//jsonBuf = "{\"id\":\"123\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":"\{\"S_D0\":%d}\"}"Serial.println(jsonBuf);mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf); }void setup(){Serial.begin(115200);pinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, 0); initWifi(WIFI_SSID, WIFI_PASSWD); Serial.println();Serial.println();mqttCheckConnect(); //初始化首次链接mqttIntervalPost(); //上报初始化数据Serial.println();mqttClient.setCallback(callback);Init_Hx711(); tm1637.init();tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;Get_Maopi();}void loop(){ESP.wdtFeed(); // 喂看门狗if (millis() - lastSend >= 10000){mqttCheckConnect(); lastSend = millis();mqttIntervalPost(); }mqttClient.loop(); Weight = Get_Weight(); int8_t ge = Weight % 10;int8_t shi = Weight / 10;int8_t bai = Weight / 100;int8_t qian = Weight / 1000;tm1637.display(0, qian);tm1637.display(1, bai);tm1637.display(2, shi);tm1637.display(3, ge);delay(2000); }

代码里面有一些配置信息需要改成自己的。

最后完美结束。

基于ESP8266 HX711 克级单位称重式压力传感器(接入阿里云物联网平台)—— 看到有点意思 所以我也照着做了一个

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。