Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // библиотека для работы с Wi-Fi
- #include <ESP8266WiFi.h>
- // библиотека для работы с MQTT - Arduino Client for MQTT
- #include <PubSubClient.h>
- // библиотека для работы с протоколом 1-Wire
- #include <OneWire.h>
- // библиотека для работы с датчиком DS18B20 - с ней датчик измеряет до +52 и потом -127 показывает(заметил такое если разрешение 12, если 9 то ниже нуля непонятные цифры)
- #include "DallasTemperature.h"
- // библиотека для работы с датчиком AHT10
- #include <AHTxx.h>
- // библиотека для работы с расширителем портов PCF8575
- #include "PCF8575.h"
- // библиотека для работы с дисплеем нокия 5110
- //#include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_PCD8544.h>
- /////////////////// SETTINGS /////////////////////////////
- // Wi-Fi
- const char* ssid = "/////////////////";
- const char* password = "/////////////////";
- // MQTT
- const char* mqtt_server = "/////////////////";
- const int mqtt_port = /////////////////;
- const char* mqtt_user = "/////////////////";
- const char* mqtt_password = "/////////////////";
- // RELAYS
- const String relay1_topic = "/allok";
- const String relay2_topic = "/ten1";
- const String relay3_topic = "/ten2";
- const String relay4_topic = "/ten3";
- const String relay5_topic = "/pump";
- //temp sensor AHT10
- char* topic_aht10 = "/temp_near_boiler";
- //temp sensor DS18B20
- char* topic_ds18b20 = "/temp_water_boiler";
- //temp set
- char* topic_set = "/need_temp_set";
- //переменные для использования millis()
- static uint32_t tmr; // переменная времени
- int t_wifi_conn = 500; // время между подключениями к wi-fi
- //переменные для хранения показаний температур
- int tm = 300;
- //переменные для хранения показаний температур
- int temp_water;//температура с датчика ds18b20
- int temp_near;//температура с датчика AHT10
- String temp_preset;//промежуточная строка для хранения задаваемой температуры
- String temp_set = "25";//основная строка для хранения задаваемой температуры
- //задаем статусы реле OFF-false
- bool relay1_on = false;
- bool relay2_on = false;
- bool relay3_on = false;
- bool relay4_on = false;
- bool relay5_on = false;
- // сигнальный провод датчика
- const int ONE_WIRE_BUS = 0; //D3
- //задаем контраст дисплея
- int contrast = 30;
- /*Hardware pin numbers */
- const int NOKIA_CLK = 2; //D4
- const int NOKIA_DIN = 1; //D10 -невозможно использовать сериал монитор
- const int NOKIA_DC = 3; //D9 -невозможно использовать сериал монитор
- const int NOKIA_CE = 13; //D7
- const int NOKIA_RST = 16; //D0
- const int NOKIA_BL = 15; //D8
- //const int ENC_A = 14; //D5
- //const int ENC_B = 12; //D6
- //const int ENC_KEY = 13; //D7
- /////////////////////////////////////////////////////////
- Adafruit_PCD8544 display = Adafruit_PCD8544(NOKIA_CLK, NOKIA_DIN, NOKIA_DC, NOKIA_CE, NOKIA_RST); //Use gpio's
- PCF8575 PCF(0x20);//Адрес PCF8575 на шине I2C
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature sensor(&oneWire);
- AHTxx AHT10(AHTXX_ADDRESS_X38, AHT1x_SENSOR); //sensor address, sensor type
- WiFiClient espClient;
- PubSubClient client(espClient);
- void setup() {
- // начинаем работу с дисплеем нокия 5110
- display.cp437(true);
- display.begin();
- display.clearDisplay();
- setContrast();
- // начинаем работу с расширителем портов PCF8575
- PCF.begin();
- // начинаем работу с датчиком AHT10
- AHT10.begin();
- // начинаем работу с датчиком DS18B20
- sensor.begin();
- // устанавливаем разрешение датчика DS18B20 от 9 до 12 бит
- sensor.setResolution(9);
- //начинаем работу с монитором порта
- //Serial.begin(9600);
- //начинаем работу с wifi
- setup_wifi();
- client.setServer(mqtt_server, mqtt_port);
- client.setCallback(callback);
- }
- void loop() {
- TempSend();
- if (!client.connected()) {
- reconnect();
- }
- client.loop();
- //mainScreen();
- }
- // Функция отправки показаний с термодатчиков
- void TempSend() {
- if (tm == 0)
- {
- sensor.requestTemperatures();
- float temp_water = sensor.getTempCByIndex(0);// от датчика получаем значение температуры
- float temp_near = AHT10.readTemperature();
- //client.publish(topic, (char*) temp.c_str());
- client.publish(topic_aht10, String(temp_near, 2).c_str(), true);// отправляем в топик для термодатчика значение температуры
- client.publish(topic_ds18b20, String(temp_water, 2).c_str(), true);// отправляем в топик для термодатчика значение температуры
- mainScreen();
- Serial.println("temp_preset");
- Serial.println(temp_preset);
- Serial.println("temp_set");
- Serial.println(temp_set);
- Serial.println("temp_near");
- Serial.println(temp_near);
- Serial.println("temp_water");
- Serial.println(temp_water);
- tm = 300; // пауза между отправками значений температуры 3 секунд
- }
- tm--;
- delay(10);
- }
- void updateStatePins(void) {
- if (relay1_on) {//главное реле - команда allOk
- PCF.write(0, LOW);
- } else {
- PCF.write(0, HIGH);
- }
- if (relay2_on) {//реле тена 1
- PCF.write(1, LOW);
- } else {
- PCF.write(1, HIGH);
- }
- if (relay3_on) {//реле тена 2
- PCF.write(2, LOW);
- } else {
- PCF.write(2, HIGH);
- }
- if (relay4_on) {//реле тена 3
- PCF.write(3, LOW);
- } else {
- PCF.write(3, HIGH);
- }
- if (relay5_on) {//реле насоса
- PCF.write(4, LOW);
- } else {
- PCF.write(4, HIGH);
- }
- }
- void callback (char* topic, byte* payload, unsigned int length) {
- String data_rel1;
- for (int i = 0; i < length; i++) {
- data_rel1 += String((char)payload[i]);
- }
- String data_rel2;
- for (int i = 0; i < length; i++) {
- data_rel2 += String((char)payload[i]);
- }
- String data_rel3;
- for (int i = 0; i < length; i++) {
- data_rel3 += String((char)payload[i]);
- }
- String data_rel4;
- for (int i = 0; i < length; i++) {
- data_rel4 += String((char)payload[i]);
- }
- String data_rel5;
- for (int i = 0; i < length; i++) {
- data_rel5 += String((char)payload[i]);
- }
- if ( String(topic) == relay1_topic ) {
- if (data_rel1 == "ON" || data_rel1 == "1") relay1_on = true;
- if (data_rel1 == "OFF" || data_rel1 == "0") relay1_on = false;
- }
- if ( String(topic) == relay2_topic ) {
- if (data_rel2 == "ON" || data_rel2 == "1") relay2_on = true;
- if (data_rel2 == "OFF" || data_rel2 == "0") relay2_on = false;
- }
- if ( String(topic) == relay3_topic ) {
- if (data_rel3 == "ON" || data_rel3 == "1") relay3_on = true;
- if (data_rel3 == "OFF" || data_rel3 == "0") relay3_on = false;
- }
- if ( String(topic) == relay4_topic ) {
- if (data_rel4 == "ON" || data_rel4 == "1") relay4_on = true;
- if (data_rel4 == "OFF" || data_rel4 == "0") relay4_on = false;
- }
- if ( String(topic) == relay5_topic ) {
- if (data_rel5 == "ON" || data_rel5 == "1") relay5_on = true;
- if (data_rel5 == "OFF" || data_rel5 == "0") relay5_on = false;
- }
- updateStatePins();
- String temp_preset;
- for (int i = 0; i < length; i++) {
- temp_preset += String((char)payload[i]);
- }
- if ( String(topic) == topic_set ) {
- temp_set = temp_preset;
- Serial.println("temp_set");
- Serial.println(temp_set);
- Serial.println("temp_preset");
- Serial.println(temp_preset);
- }
- }
- void reconnect() {
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- String clientId = "ESP8266-" + WiFi.macAddress();
- if (client.connect(clientId.c_str(), mqtt_user, mqtt_password) ) {
- Serial.println("connected");
- //client.subscribe( topic_set, String(temp_set, 1).c_str() );
- client.subscribe(topic_set);
- //client.subscribe((topic_set + "/#",String(temp_set, 1).c_str()));
- //client.subscribe(topic_set, String(temp_set, 1).c_str() );
- client.subscribe( (relay1_topic + "/#").c_str() );
- client.subscribe( (relay2_topic + "/#").c_str() );
- client.subscribe( (relay3_topic + "/#").c_str() );
- client.subscribe( (relay4_topic + "/#").c_str() );
- client.subscribe( (relay5_topic + "/#").c_str() );
- Serial.println("reconnect");
- } else {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- delay(1000);
- }
- }
- }
- void setup_wifi() {
- delay(10);
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.mode(WIFI_STA);
- WiFi.begin(ssid, password);
- if (millis() - tmr >= t_wifi_conn) {
- tmr = millis();
- while (WiFi.status() != WL_CONNECTED) {
- //delay(500);//заменен на tmr = millis()
- Serial.print(".");
- }
- }
- randomSeed(micros());
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- }
- void mainScreen()
- {
- display.clearDisplay();
- display.drawFastHLine(1, 1, 83, BLACK);
- display.setTextSize(1);
- display.setCursor(1, 3);
- display.print(utf8rus("ТемперНВ\xB0\C:"));//русские шрифты заработали после замены файла glcdfont.c и добавление отдельного скетча utf8rus.ino
- display.println(temp_near, 1);//один знак после запятой
- display.setTextSize(1);
- display.setCursor(1, 11);
- display.println(utf8rus("Желаемая\xB0\C:"));
- display.setCursor(67, 11);
- display.println(temp_set);
- display.setTextSize(1);
- display.setCursor(1, 19);
- display.print(utf8rus("ТемперОЖ\xB0\C:"));
- display.setCursor(67, 19);
- display.println(temp_water, 1);//один знак после запятой
- display.setTextSize(1);
- display.drawFastHLine(1, 28, 83, BLACK);
- display.setCursor(1, 30);
- display.print(utf8rus("Насос"));
- display.setTextSize(1);
- display.setCursor(8, 38);
- display.print(utf8rus("("));
- display.setTextSize(1);
- display.setCursor(18, 38);
- display.print(utf8rus(")"));
- display.setTextSize(1);
- display.setCursor(58, 30);
- display.print(utf8rus("ТЭН"));
- display.setTextSize(1);
- display.setCursor(56, 38);
- display.print(utf8rus("1"));
- display.setTextSize(1);
- display.setCursor(64, 38);
- display.print(utf8rus("2"));
- display.setTextSize(1);
- display.setCursor(64, 44);
- display.print(utf8rus("-"));
- display.setTextSize(1);
- display.setCursor(72, 38);
- display.print(utf8rus("3"));
- display.setTextSize(1);
- display.setCursor(72, 44);
- display.print(utf8rus("-"));
- display.display();
- }
- void setContrast()
- {
- display.setContrast(contrast);
- display.display();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement