• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);
}
 
Сверху Снизу