• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ds18b20 esp8266-12 max7219 передача по UDP

Ildarmustafin86

Active member
Индикация показаний температуры ds18b20 на семисегментный индикатор на MAX7219, а также передача данных по udp на другой esp8266-12. Также используются два светодиода для индикации передачи данных (D2) и индикации подключения к wifi (D0)

Код:
#include "LedControl.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define LED_CON 4      // D2 GPIO4
#define LED_WIFI 16    // D0 GPIO16
#define ONE_WIRE_BUS 5 // D1 GPIO5
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress t1, t2, t3, t4;
// D8 - DIN
// D7 - Clk
// D6 - LOAD
LedControl lc=LedControl(D8,D7,D6,1);
const char dev_id[] = "1"; //device id
char Txt1[] = "test";
char Txt2[] = "test";
char buffer[255];

const char* ssid = "smart_home";
const char* password = "figvam00";
const int g_port = 8888;
WiFiUDP Udp;

void setup() {
  pinMode(LED_CON, OUTPUT);
  pinMode(LED_WIFI, OUTPUT);
  digitalWrite(LED_CON, LOW);
  digitalWrite(LED_WIFI, LOW);
//--------------------------------------------------------------------------------------
// Настройка WIFi и UDP
//--------------------------------------------------------------------------------------
  WiFi.softAPdisconnect();
  WiFi.mode(WIFI_STA);
  if (WiFi.getAutoConnect() != true) {
    WiFi.setAutoConnect(true);
    WiFi.setAutoReconnect(true);
  }
  WiFi.begin(ssid, password);
  Udp.begin(g_port);
//--------------------------------------------------------------------------------------
// Настройка индикатора на MAX7219
//--------------------------------------------------------------------------------------
  int devices=lc.getDeviceCount();
  for(int address=0;address<devices;address++) {
    lc.shutdown(address,false);
    lc.setIntensity(address,8);
    lc.clearDisplay(address);
  }
//--------------------------------------------------------------------------------------
// Настройка DS18b20
//--------------------------------------------------------------------------------------
  sensors.begin();
  sensors.getAddress(t1, 0);
  sensors.getAddress(t2, 1);
  sensors.setResolution(t1, TEMPERATURE_PRECISION); 
  sensors.setResolution(t2, TEMPERATURE_PRECISION); 
}

//--------------------------------------------------------------------------------------
// Функция вывода показаний на семисегментный индикатор на чипе MAX7219
//--------------------------------------------------------------------------------------
void showDigit (float temp, byte address, byte raz4, byte raz3, byte raz2, byte raz1) {
int iNum;
if (temp < 100) iNum = temp * 10;
if (temp < 0) iNum = -iNum;
byte tIn4 =  iNum % 10;              // Единицы   "Х Х Х 1"
byte tIn3 = (iNum / 10) % 10;        // Десятки   "Х Х 1 Х"
byte tIn2 = (iNum / 100) % 10;       // Сотни     "Х 1 Х Х"
byte tIn1 = (iNum / 1000) % 10;      // Тысячи    "1 Х Х Х" 
if (temp < 0) {                          // Индикация отрицательных показаний
if (temp ==-127) {                       // При ошибке -127 выводит -er-
  lc.setChar(address,raz1,'-',false);
  lc.setChar(address,raz2,'e',false); 
  lc.setRow(address,raz3,0x05);
  lc.setChar(address,raz4,'-',false);
} else {                                
     lc.setChar(address,raz1,'-',false);
     lc.setDigit(address,raz2,tIn2,false);
     lc.setDigit(address,raz3,tIn3,true);
     lc.setDigit(address,raz4,tIn4,false);
}
} else if (temp >= 0) {                  // Индикация положительных показаний
   lc.setDigit(address,raz2,tIn2,false);
   lc.setDigit(address,raz3,tIn3,true);
   lc.setDigit(address,raz4,tIn4,false); 
}
}
//--------------------------------------------------------------------------------------

void loop() {
IPAddress ip = WiFi.localIP();
ip[3] = 255;
sensors.requestTemperatures();
float tempC1 = sensors.getTempC(t1);
float tempC2 = sensors.getTempC(t2);
lc.clearDisplay(0);
showDigit(tempC1,0,0,1,2,3);
showDigit(tempC2,0,4,5,6,7);
delay(1500);
if (WiFi.status() == WL_CONNECTED) { // Если подключен к роутеру
   digitalWrite(LED_WIFI, HIGH);      // Зажигаем светодиод подключения к wifi
   Udp.beginPacket(ip,g_port); 
   dtostrf (tempC1, 3,1,Txt1);
   dtostrf (tempC2, 3,1,Txt2);
   sprintf(buffer,"%s %s %s",dev_id, Txt1, Txt2);
   digitalWrite(LED_CON, HIGH);       // Зажигаем светодиод передачи данных
   Udp.write(buffer);                 // Передаем данные
   Udp.endPacket();
   delay(500);
   digitalWrite(LED_CON, LOW);        // Гасим светодиод передачи данных
} else {
   digitalWrite(LED_WIFI, LOW);
   delay(500);
}
}

Ко второму esp подключен LCD2004А.

Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const char* ssid = "smart_home";
const char* password = "figvam00";

uint8_t gr_c[8] = {B11000,B11000,B00111,B00101,B00100,B00101,B00111}; // градус С
uint8_t bukva_bI[8] = {
  B00000,
  B00000,
  B10001,
  B10001,
  B11101,
  B10101,
  B11101};
uint8_t bukva_L[8] = {0x3,0x7,0x5,0x5,0xD,0x9,0x19};
unsigned int localPort = 8888;
char packetBuffer[255];
char dev_id[10];
char t1[100];
char t2[100];

LiquidCrystal_I2C lcd(0x27,20,4);

WiFiUDP Udp;
void setup(void){
  WiFi.softAPdisconnect();
  WiFi.mode(WIFI_STA); 
  if (WiFi.getAutoConnect() != true) {
      WiFi.setAutoConnect(true); 
      WiFi.setAutoReconnect(true);
    }
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");
  lcd.begin();
  lcd.backlight();
 
  lcd.createChar(0, bukva_bI);
  lcd.createChar(1, bukva_L);
  lcd.createChar(2, gr_c);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Udp.begin(localPort);
}
void loop(void){
lcd.home(); 
int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }

    sscanf(packetBuffer, "%s %s %s",&dev_id,&t1,&t2);
    if ((String)dev_id == "1"){
    lcd.setCursor(0, 0);
    lcd.print("                    ");     
    lcd.setCursor(0, 0);
    lcd.print("Kyp");
    lcd.print(char(0));   
    lcd.print(":");
   
    if (atof(t1)< 0) {
    lcd.setCursor(7, 0);   
    lcd.print((String)t1);
    lcd.print(char(2));
    } else {
    lcd.setCursor(8, 0);   
    lcd.print((String)t1);
    lcd.print(char(2));
    }
   
    if (atof(t2) < 0) {
    lcd.setCursor(14, 0);   
    lcd.print((String)t2);
    lcd.print(char(2));      
    } else {
    lcd.setCursor(15, 0);   
    lcd.print((String)t2);
    lcd.print(char(2));      
    }
    }

     if ((String)dev_id == "2"){
    lcd.setCursor(0, 1);
    lcd.print("                    ");     
    lcd.setCursor(0, 1);
    lcd.print("Kyp");
    lcd.print(char(0));   
    lcd.print(":");
   
    if (atof(t1)< 0) {
    lcd.setCursor(7, 1);   
    lcd.print((String)t1);
    lcd.print(char(2));
    } else {
    lcd.setCursor(8, 1);   
    lcd.print((String)t1);
    lcd.print(char(2));
    }
   
    if (atof(t2) < 0) {
    lcd.setCursor(14, 1);   
    lcd.print((String)t2);
    lcd.print(char(2));      
    } else {
    lcd.setCursor(15, 1);   
    lcd.print((String)t2);
    lcd.print(char(2));      
    }
    }
    Serial.print("Temp1:");
    Serial.print((String)t1);   
    Serial.print("  Temp2:");
    Serial.println((String)t2);
}
  delay(5);
}
 
Сверху Снизу