Ildarmustafin86
Active member
Индикация показаний температуры ds18b20 на семисегментный индикатор на MAX7219, а также передача данных по udp на другой esp8266-12. Также используются два светодиода для индикации передачи данных (D2) и индикации подключения к wifi (D0)
Ко второму esp подключен LCD2004А.
Код:
#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);
}