Advertisement
Guest User

MQTT example

a guest
Jul 13th, 2022
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.10 KB | None | 0 0
  1. // библиотека для работы с Wi-Fi
  2.  
  3. #include <ESP8266WiFi.h>
  4.  
  5. // библиотека для работы с MQTT - Arduino Client for MQTT
  6.  
  7. #include <PubSubClient.h>
  8.  
  9. // библиотека для работы с протоколом 1-Wire
  10.  
  11. #include <OneWire.h>
  12.  
  13. // библиотека для работы с датчиком DS18B20 - с ней датчик измеряет до +52 и потом -127 показывает(заметил такое если разрешение 12, если 9 то ниже нуля непонятные цифры)
  14.  
  15. #include "DallasTemperature.h"
  16.  
  17. // библиотека для работы с датчиком AHT10
  18.  
  19. #include <AHTxx.h>
  20.  
  21. // библиотека для работы с расширителем портов PCF8575
  22.  
  23. #include "PCF8575.h"
  24.  
  25. // библиотека для работы с дисплеем нокия 5110
  26.  
  27. //#include <SPI.h>
  28.  
  29. #include <Adafruit_GFX.h>
  30.  
  31. #include <Adafruit_PCD8544.h>
  32.  
  33.  
  34.  
  35.  
  36.  
  37. /////////////////// SETTINGS /////////////////////////////
  38.  
  39.  
  40.  
  41. // Wi-Fi
  42.  
  43. const char* ssid = "/////////////////";
  44.  
  45. const char* password = "/////////////////";
  46.  
  47.  
  48.  
  49. // MQTT
  50.  
  51. const char* mqtt_server = "/////////////////";
  52.  
  53. const int mqtt_port = /////////////////;
  54.  
  55. const char* mqtt_user = "/////////////////";
  56.  
  57. const char* mqtt_password = "/////////////////";
  58.  
  59.  
  60.  
  61. // RELAYS
  62.  
  63. const String relay1_topic = "/allok";
  64.  
  65. const String relay2_topic = "/ten1";
  66.  
  67. const String relay3_topic = "/ten2";
  68.  
  69. const String relay4_topic = "/ten3";
  70.  
  71. const String relay5_topic = "/pump";
  72.  
  73.  
  74.  
  75. //temp sensor AHT10
  76.  
  77. char* topic_aht10 = "/temp_near_boiler";
  78.  
  79.  
  80.  
  81. //temp sensor DS18B20
  82.  
  83. char* topic_ds18b20 = "/temp_water_boiler";
  84.  
  85.  
  86.  
  87. //temp set
  88.  
  89. char* topic_set = "/need_temp_set";
  90.  
  91.  
  92.  
  93. //переменные для использования millis()
  94.  
  95. static uint32_t tmr; // переменная времени
  96.  
  97. int t_wifi_conn = 500; // время между подключениями к wi-fi
  98.  
  99.  
  100.  
  101. //переменные для хранения показаний температур
  102.  
  103. int tm = 300;
  104.  
  105.  
  106.  
  107. //переменные для хранения показаний температур
  108.  
  109. int temp_water;//температура с датчика ds18b20
  110.  
  111. int temp_near;//температура с датчика AHT10
  112.  
  113. String temp_preset;//промежуточная строка для хранения задаваемой температуры
  114.  
  115. String temp_set = "25";//основная строка для хранения задаваемой температуры
  116.  
  117.  
  118.  
  119. //задаем статусы реле OFF-false
  120.  
  121. bool relay1_on = false;
  122.  
  123. bool relay2_on = false;
  124.  
  125. bool relay3_on = false;
  126.  
  127. bool relay4_on = false;
  128.  
  129. bool relay5_on = false;
  130.  
  131.  
  132.  
  133. // сигнальный провод датчика
  134.  
  135. const int ONE_WIRE_BUS = 0; //D3
  136.  
  137.  
  138.  
  139. //задаем контраст дисплея
  140.  
  141. int contrast = 30;
  142.  
  143.  
  144.  
  145. /*Hardware pin numbers */
  146.  
  147. const int NOKIA_CLK = 2; //D4
  148.  
  149. const int NOKIA_DIN = 1; //D10 -невозможно использовать сериал монитор
  150.  
  151. const int NOKIA_DC = 3; //D9 -невозможно использовать сериал монитор
  152.  
  153. const int NOKIA_CE = 13; //D7
  154.  
  155. const int NOKIA_RST = 16; //D0
  156.  
  157. const int NOKIA_BL = 15; //D8
  158.  
  159. //const int ENC_A = 14; //D5
  160.  
  161. //const int ENC_B = 12; //D6
  162.  
  163. //const int ENC_KEY = 13; //D7
  164.  
  165.  
  166.  
  167. /////////////////////////////////////////////////////////
  168.  
  169. Adafruit_PCD8544 display = Adafruit_PCD8544(NOKIA_CLK, NOKIA_DIN, NOKIA_DC, NOKIA_CE, NOKIA_RST); //Use gpio's
  170.  
  171.  
  172.  
  173. PCF8575 PCF(0x20);//Адрес PCF8575 на шине I2C
  174.  
  175.  
  176.  
  177. OneWire oneWire(ONE_WIRE_BUS);
  178.  
  179.  
  180.  
  181. DallasTemperature sensor(&oneWire);
  182.  
  183.  
  184.  
  185. AHTxx AHT10(AHTXX_ADDRESS_X38, AHT1x_SENSOR); //sensor address, sensor type
  186.  
  187.  
  188.  
  189. WiFiClient espClient;
  190.  
  191. PubSubClient client(espClient);
  192.  
  193.  
  194.  
  195. void setup() {
  196.  
  197.   // начинаем работу с дисплеем нокия 5110
  198.  
  199.   display.cp437(true);
  200.  
  201.   display.begin();
  202.  
  203.   display.clearDisplay();
  204.  
  205.   setContrast();
  206.  
  207.   // начинаем работу с расширителем портов PCF8575
  208.  
  209.   PCF.begin();
  210.  
  211.   // начинаем работу с датчиком AHT10
  212.  
  213.   AHT10.begin();
  214.  
  215.   // начинаем работу с датчиком DS18B20
  216.  
  217.   sensor.begin();
  218.  
  219.   // устанавливаем разрешение датчика DS18B20 от 9 до 12 бит
  220.  
  221.   sensor.setResolution(9);
  222.  
  223.   //начинаем работу с монитором порта
  224.  
  225.   //Serial.begin(9600);
  226.  
  227.   //начинаем работу с wifi
  228.  
  229.   setup_wifi();
  230.  
  231.   client.setServer(mqtt_server, mqtt_port);
  232.  
  233.   client.setCallback(callback);
  234.  
  235. }
  236.  
  237.  
  238.  
  239. void loop() {
  240.  
  241.   TempSend();
  242.  
  243.   if (!client.connected()) {
  244.  
  245.     reconnect();
  246.  
  247.   }
  248.  
  249.   client.loop();
  250.  
  251.   //mainScreen();
  252.  
  253. }
  254.  
  255.  
  256.  
  257. // Функция отправки показаний с термодатчиков
  258.  
  259. void TempSend() {
  260.  
  261.   if (tm == 0)
  262.  
  263.   {
  264.  
  265.     sensor.requestTemperatures();
  266.  
  267.     float temp_water = sensor.getTempCByIndex(0);// от датчика получаем значение температуры
  268.  
  269.     float temp_near = AHT10.readTemperature();
  270.  
  271.     //client.publish(topic, (char*) temp.c_str());
  272.  
  273.  
  274.  
  275.     client.publish(topic_aht10,  String(temp_near, 2).c_str(), true);// отправляем в топик для термодатчика значение температуры
  276.  
  277.     client.publish(topic_ds18b20,  String(temp_water, 2).c_str(), true);// отправляем в топик для термодатчика значение температуры
  278.  
  279.     mainScreen();
  280.  
  281.     Serial.println("temp_preset");
  282.  
  283.     Serial.println(temp_preset);
  284.  
  285.     Serial.println("temp_set");
  286.  
  287.     Serial.println(temp_set);
  288.  
  289.     Serial.println("temp_near");
  290.  
  291.     Serial.println(temp_near);
  292.  
  293.     Serial.println("temp_water");
  294.  
  295.     Serial.println(temp_water);
  296.  
  297.     tm = 300; // пауза между отправками значений температуры 3 секунд
  298.  
  299.   }
  300.  
  301.   tm--;
  302.  
  303.   delay(10);
  304.  
  305. }
  306.  
  307.  
  308.  
  309. void updateStatePins(void) {
  310.  
  311.   if (relay1_on) {//главное реле - команда allOk
  312.  
  313.     PCF.write(0, LOW);
  314.  
  315.   } else {
  316.  
  317.     PCF.write(0, HIGH);
  318.  
  319.   }
  320.  
  321.   if (relay2_on) {//реле тена 1
  322.  
  323.     PCF.write(1, LOW);
  324.  
  325.   } else {
  326.  
  327.     PCF.write(1, HIGH);
  328.  
  329.   }
  330.  
  331.   if (relay3_on) {//реле тена 2
  332.  
  333.     PCF.write(2, LOW);
  334.  
  335.   } else {
  336.  
  337.     PCF.write(2, HIGH);
  338.  
  339.   }
  340.  
  341.   if (relay4_on) {//реле тена 3
  342.  
  343.     PCF.write(3, LOW);
  344.  
  345.   } else {
  346.  
  347.     PCF.write(3, HIGH);
  348.  
  349.   }
  350.  
  351.   if (relay5_on) {//реле насоса
  352.  
  353.     PCF.write(4, LOW);
  354.  
  355.   } else {
  356.  
  357.     PCF.write(4, HIGH);
  358.  
  359.   }
  360.  
  361. }
  362.  
  363.  
  364.  
  365. void callback (char* topic, byte* payload, unsigned int length) {
  366.  
  367.  
  368.  
  369.   String data_rel1;
  370.  
  371.   for (int i = 0; i < length; i++) {
  372.  
  373.     data_rel1 += String((char)payload[i]);
  374.  
  375.   }
  376.  
  377.   String data_rel2;
  378.  
  379.   for (int i = 0; i < length; i++) {
  380.  
  381.     data_rel2 += String((char)payload[i]);
  382.  
  383.   }
  384.  
  385.   String data_rel3;
  386.  
  387.   for (int i = 0; i < length; i++) {
  388.  
  389.     data_rel3 += String((char)payload[i]);
  390.  
  391.   }
  392.  
  393.   String data_rel4;
  394.  
  395.   for (int i = 0; i < length; i++) {
  396.  
  397.     data_rel4 += String((char)payload[i]);
  398.  
  399.   }
  400.  
  401.   String data_rel5;
  402.  
  403.   for (int i = 0; i < length; i++) {
  404.  
  405.     data_rel5 += String((char)payload[i]);
  406.  
  407.   }
  408.  
  409.  
  410.  
  411.   if ( String(topic) == relay1_topic ) {
  412.  
  413.     if (data_rel1 == "ON" || data_rel1 == "1") relay1_on = true;
  414.  
  415.     if (data_rel1 == "OFF" || data_rel1 == "0") relay1_on = false;
  416.  
  417.   }
  418.  
  419.   if ( String(topic) == relay2_topic ) {
  420.  
  421.     if (data_rel2 == "ON" || data_rel2 == "1") relay2_on = true;
  422.  
  423.     if (data_rel2 == "OFF" || data_rel2 == "0") relay2_on = false;
  424.  
  425.   }
  426.  
  427.   if ( String(topic) == relay3_topic ) {
  428.  
  429.     if (data_rel3 == "ON" || data_rel3 == "1") relay3_on = true;
  430.  
  431.     if (data_rel3 == "OFF" || data_rel3 == "0") relay3_on = false;
  432.  
  433.   }
  434.  
  435.   if ( String(topic) == relay4_topic ) {
  436.  
  437.     if (data_rel4 == "ON" || data_rel4 == "1") relay4_on = true;
  438.  
  439.     if (data_rel4 == "OFF" || data_rel4 == "0") relay4_on = false;
  440.  
  441.   }
  442.  
  443.   if ( String(topic) == relay5_topic ) {
  444.  
  445.     if (data_rel5 == "ON" || data_rel5 == "1") relay5_on = true;
  446.  
  447.     if (data_rel5 == "OFF" || data_rel5 == "0") relay5_on = false;
  448.  
  449.   }
  450.  
  451.   updateStatePins();
  452.  
  453.  
  454.  
  455.   String temp_preset;
  456.  
  457.   for (int i = 0; i < length; i++) {
  458.  
  459.     temp_preset += String((char)payload[i]);
  460.  
  461.   }
  462.  
  463.  
  464.  
  465.   if ( String(topic) == topic_set ) {
  466.  
  467.     temp_set = temp_preset;
  468.  
  469.     Serial.println("temp_set");
  470.  
  471.     Serial.println(temp_set);
  472.  
  473.     Serial.println("temp_preset");
  474.  
  475.     Serial.println(temp_preset);
  476.  
  477.   }
  478.  
  479.  
  480.  
  481. }
  482.  
  483.  
  484.  
  485. void reconnect() {
  486.  
  487.   while (!client.connected()) {
  488.  
  489.     Serial.print("Attempting MQTT connection...");
  490.  
  491.     String clientId = "ESP8266-" + WiFi.macAddress();
  492.  
  493.     if (client.connect(clientId.c_str(), mqtt_user, mqtt_password) ) {
  494.  
  495.       Serial.println("connected");
  496.  
  497.       //client.subscribe( topic_set, String(temp_set, 1).c_str() );
  498.  
  499.       client.subscribe(topic_set);
  500.  
  501.       //client.subscribe((topic_set + "/#",String(temp_set, 1).c_str()));
  502.  
  503.       //client.subscribe(topic_set,  String(temp_set, 1).c_str() );
  504.  
  505.       client.subscribe( (relay1_topic + "/#").c_str() );
  506.  
  507.       client.subscribe( (relay2_topic + "/#").c_str() );
  508.  
  509.       client.subscribe( (relay3_topic + "/#").c_str() );
  510.  
  511.       client.subscribe( (relay4_topic + "/#").c_str() );
  512.  
  513.       client.subscribe( (relay5_topic + "/#").c_str() );
  514.  
  515.       Serial.println("reconnect");
  516.  
  517.     } else {
  518.  
  519.       Serial.print("failed, rc=");
  520.  
  521.       Serial.print(client.state());
  522.  
  523.       Serial.println(" try again in 5 seconds");
  524.  
  525.       delay(1000);
  526.  
  527.     }
  528.  
  529.   }
  530.  
  531. }
  532.  
  533.  
  534.  
  535. void setup_wifi() {
  536.  
  537.  
  538.  
  539.   delay(10);
  540.  
  541.   Serial.println();
  542.  
  543.   Serial.print("Connecting to ");
  544.  
  545.   Serial.println(ssid);
  546.  
  547.  
  548.  
  549.   WiFi.mode(WIFI_STA);
  550.  
  551.   WiFi.begin(ssid, password);
  552.  
  553.  
  554.  
  555.   if (millis() - tmr >= t_wifi_conn) {
  556.  
  557.     tmr = millis();
  558.  
  559.     while (WiFi.status() != WL_CONNECTED) {
  560.  
  561.       //delay(500);//заменен на tmr = millis()
  562.  
  563.       Serial.print(".");
  564.  
  565.     }
  566.  
  567.   }
  568.  
  569.  
  570.  
  571.   randomSeed(micros());
  572.  
  573.  
  574.  
  575.   Serial.println("");
  576.  
  577.   Serial.println("WiFi connected");
  578.  
  579.   Serial.println("IP address: ");
  580.  
  581.   Serial.println(WiFi.localIP());
  582.  
  583. }
  584.  
  585.  
  586.  
  587. void mainScreen()
  588.  
  589. {
  590.  
  591.   display.clearDisplay();
  592.  
  593.   display.drawFastHLine(1, 1, 83, BLACK);
  594.  
  595.   display.setTextSize(1);
  596.  
  597.   display.setCursor(1, 3);
  598.  
  599.   display.print(utf8rus("ТемперНВ\xB0\C:"));//русские шрифты заработали после замены файла glcdfont.c и добавление отдельного скетча utf8rus.ino
  600.  
  601.   display.println(temp_near, 1);//один знак после запятой
  602.  
  603.   display.setTextSize(1);
  604.  
  605.   display.setCursor(1, 11);
  606.  
  607.   display.println(utf8rus("Желаемая\xB0\C:"));
  608.  
  609.   display.setCursor(67, 11);
  610.  
  611.   display.println(temp_set);
  612.  
  613.   display.setTextSize(1);
  614.  
  615.   display.setCursor(1, 19);
  616.  
  617.   display.print(utf8rus("ТемперОЖ\xB0\C:"));
  618.  
  619.   display.setCursor(67, 19);
  620.  
  621.   display.println(temp_water, 1);//один знак после запятой
  622.  
  623.   display.setTextSize(1);
  624.  
  625.   display.drawFastHLine(1, 28, 83, BLACK);
  626.  
  627.   display.setCursor(1, 30);
  628.  
  629.   display.print(utf8rus("Насос"));
  630.  
  631.   display.setTextSize(1);
  632.  
  633.   display.setCursor(8, 38);
  634.  
  635.   display.print(utf8rus("("));
  636.  
  637.   display.setTextSize(1);
  638.  
  639.   display.setCursor(18, 38);
  640.  
  641.   display.print(utf8rus(")"));
  642.  
  643.   display.setTextSize(1);
  644.  
  645.   display.setCursor(58, 30);
  646.  
  647.   display.print(utf8rus("ТЭН"));
  648.  
  649.   display.setTextSize(1);
  650.  
  651.   display.setCursor(56, 38);
  652.  
  653.   display.print(utf8rus("1"));
  654.  
  655.   display.setTextSize(1);
  656.  
  657.   display.setCursor(64, 38);
  658.  
  659.   display.print(utf8rus("2"));
  660.  
  661.   display.setTextSize(1);
  662.  
  663.   display.setCursor(64, 44);
  664.  
  665.   display.print(utf8rus("-"));
  666.  
  667.   display.setTextSize(1);
  668.  
  669.   display.setCursor(72, 38);
  670.  
  671.   display.print(utf8rus("3"));
  672.  
  673.   display.setTextSize(1);
  674.  
  675.   display.setCursor(72, 44);
  676.  
  677.   display.print(utf8rus("-"));
  678.  
  679.   display.display();
  680.  
  681.  
  682.  
  683. }
  684.  
  685.  
  686.  
  687. void setContrast()
  688.  
  689. {
  690.  
  691.   display.setContrast(contrast);
  692.  
  693.   display.display();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement