#1 28-11-2021 05:43:35

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Сделал сегодня крутейшую штуку. Градусник состоит из ESP8266 + 2шт DS18B20 + 2ш светодиодных дисплеев MAX7219(можно и одним MAX7219 обойтись, если сделать градусник не сильно точным в индикации).

Не в сети

#2 28-11-2021 05:54:11

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Градусник, с двумя дисплеями Max7219.

16380534913875396097719592795347.jpg
Градусник с одним дисплеем Max7219. Чтоб считывать значения двух градусников было легче, один градусник имеет два разряда после запятой, другой только один разряд после запятой. При индикации отрицательной температуры, теряем ещё один разряд точности и т.д.

16380535778606458439265491322777.jpg

Не в сети

#3 28-11-2021 06:06:38

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Градусник может измерять/отображать температуру с двух датчиков DS18B20 и передавать данные по протоколу ESP NOW(через свой WiFi передатчик) на другой микропроцессор/приёмник ESP8266/ESP32 без формирования локальной сети/без соединения с общей сетью/вообще без Интернета идёт передача данных.

Не в сети

#4 28-11-2021 06:23:04

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Протокол передачи данных ESP NOW в диапазоне WiFi, есть уникальная разработка Espressif Systems. Очень быстрый и дальнобойный протокол для передачи коротких сообщений. Дальность пока не измерял, но с не большими внешними антеннами, дальность доходит до 500 метров(по отзывам в сети).

Не в сети

#5 28-11-2021 06:32:09

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

ESP8266 получает данные с градусников DS18B20 и транслирует их на свои светодиодные дисплеи MAX7219. Далее,  ESP8266 передаёт данные на терминал/приёмник/ESP32. ESP32 принимает данные и выводит их на стандартный VGA монитор.

Не в сети

#6 28-11-2021 06:37:47

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

16380562358501773117564242453343.jpg

Не в сети

#7 28-11-2021 06:40:37

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Модуль ESP32 принимающий данные градусников и он же формирует Vga изображение для монитора.
16380563975171600327515975967667.jpg

Не в сети

#8 28-11-2021 06:50:41

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Победить протокол Esp Now, помогли труды человека под ником timmbogner на Гитхабе.
https://github.com/timmbogner/Farm-Data-Relay-System
За основу передачи данных, был взят его код. Мучился с проблемой несколько месяцев и вот получилось!

Не в сети

#9 28-11-2021 06:57:10

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Код градусника на ESP8266+2xDS18B20. Оба DS18B20 сидят параллельно на 5 порту ESP8266.

#include <esp8266_hw_spi_max7219_7seg.h>
#define SPI_SPEED             20000000 //SPI@20MHZ частота шины SPI
#define SPI_CSPIN             16       //SPI CS=GPIO16 любой свободный порт,CLK обязательно на GPIO14, DIN обязательно на GPO13(на этом же порту синий светодиод, который совершенно не мешает обмену данными с дисплеем) 
#define DISP_BRGTH            8       //brightness of the display (0-15)
#define DISP_AMOUNT           2       //number of max 7seg modules connected
BgrMax7seg ld = BgrMax7seg(SPI_SPEED, SPI_CSPIN, DISP_AMOUNT);
///////////////////////////////////////////////////////////////////////
#define READING_ID    1    //Unique integer for each data reading
#define GTWY_MAC      0x00 //Gateway MAC
#define SLEEPYTIME    3   //Time to sleep in seconds
#define ONE_WIRE_BUS  5   //Pin that the DS18B20 is connected to
#include <ESP8266WiFi.h>
#include <espnow.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "DataReading.h"
uint8_t broadcastAddress[] = {0x84, 0xCC, 0xA8, 0xB0, 0x78, 0xE7};
int wait_time = 0;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0) {
    Serial.println("Delivery success");
  }
  else {
    Serial.println("Delivery fail");
  }
}
void setup() {
  /* init displays*/
  ld.init();
  ld.setBright(DISP_BRGTH, ALL_MODULES);
  ld.print("test.test", ALL_MODULES);   // prints string "test.test" on all connected modules
ld.clear(ALL_MODULES);              //clear all displays
//////////////////////////////////
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  if (esp_now_init() != 0) {
    return;
  }
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_register_send_cb(OnDataSent);
  // Register peer
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0);
  sensors.begin();
}
void loop() {
  if (millis() > wait_time) {
    wait_time = wait_time + SLEEPYTIME * 1000;
    loadData();
  }
}
void loadData() {
  sensors.requestTemperatures(); // Send the command to get temperatures
  float tempC = sensors.getTempCByIndex(0);
  Serial.println(tempC);
  float tempC1 = sensors.getTempCByIndex(1);
  Serial.println(tempC1);
  DataReading Temp;
  Temp.id = READING_ID;
  Temp.t = 1;
  //  if (tempC = DEVICE_DISCONNECTED_C) Temp.d = -69.00;
  //  else Temp.d = tempC;
  Temp.d = tempC;
  esp_now_send(broadcastAddress, (uint8_t *) &Temp, sizeof(Temp));
DataReading Temp1;
  Temp.id = READING_ID;
  Temp.t = 1;
  //  if (tempC = DEVICE_DISCONNECTED_C) Temp.d = -69.00;
  //  else Temp.d = tempC;
  Temp.d = tempC1;
  esp_now_send(broadcastAddress, (uint8_t *) &Temp, sizeof(Temp1));
 ld.print(String(tempC,2), 0);   
 ld.print(String(tempC1,2), 1);   
}

Не в сети

#10 28-11-2021 07:00:39

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

+ библиотека коротенькая, которая должна лежать в одной папке с кодом в предыдущем посту с именем DataReading.h

typedef struct DataReading {
  float d;
  uint16_t id;
  uint8_t t;

} DataReading;

Не в сети

#11 28-11-2021 07:02:31

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

16380576823326534199177302560494.jpg

Не в сети

#12 28-11-2021 07:05:51

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Код терминала на ESP32 и VGA дисплея.

#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
//////////////////////////////////////////////////////////
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <espnow.h>
#elif defined(ESP32)
#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>
#endif
#include "fdrs_config.h"
#include "DataReading.h"
char TEMP[10]="";
char TEMP1[10]="";
uint8_t selfAddress[] = {0x84, 0xCC, 0xA8, 0xB0, 0x78, 0xE7};
uint8_t nextAddress[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, NEXT_MAC};
uint8_t broadcast_mac[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
DataReading incData[31];
DataReading theData[31];
DataReading theCommands[31];
bool newCMD = false;
int wait_time = 0;
int tot_readings = 0;
int tot_commands = 0;
#if defined(ESP8266)
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0) {
    Serial.println("Delivery success");
  }
  else {
    Serial.println("Delivery fail");
  }
}
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
#elif defined(ESP32)
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("Last Packet Send Status:");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
#endif
  uint8_t incMAC[6];
  memcpy(&incData, incomingData, len);
  memcpy(&mac, incMAC, 6);
  //if (memcmp(&incMAC, &nextAddress, 6) == 0)
  int pkt_readings = len / sizeof(DataReading);
  Serial.println(":Packet:");
  for (byte i = 0; i < pkt_readings; i++) {
    Serial.println("SENSOR ID: " + String(incData[i].id) + "  TYPE " + String(incData[i].t) + "  DATA " + String(incData[i].d));
//////////////////////////////////////////////////////ВЫВОД ТЕМПЕРАТУРЫ НА ДИСПЛЕЙ/////////////////////////////////////////////
//////////////////////////////////////////////////////
canvas.clear();
sprintf(TEMP, "%s",String(incData[i].d)+" *C");
canvas.drawTextFmt(0,10,TEMP1);
sprintf(TEMP1, "%s",String(incData[i].d)+" *C");
canvas.drawTextFmt(0,40,TEMP1);
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////  
    if (incData[i].t < 200) {
      if (tot_readings >= 250 / sizeof(DataReading)) {
        Serial.println("ERROR::Too many sensor readings sent within delay period.");
        break;
      }
      theData[tot_readings] = incData[i];  //Save the current incoming reading to the next open packet slot
      ++tot_readings;
    } else {
      theCommands[tot_commands] = incData[i];  //Save the current incoming reading to the next open packet slot
      ++tot_commands;
      newCMD = true;
    }
  }
}

void setup() {
 DisplayController.begin();
DisplayController.setResolution(VGA_320x200_75Hz);
canvas.selectFont(&fabgl::FONT_std_24);
canvas.clear();
canvas.setPenColor(Color::Green);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
canvas.drawTextFmt(0,10,"VGA" );
///////////////////////////////////
  // Init Serial
  Serial.begin(115200);
  // Init WiFi
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address
#if defined(ESP8266)
  wifi_set_macaddr(STATION_IF, selfAddress);
  if (esp_now_init() != 0) {
    return;
  }
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  // Register peer
  esp_now_add_peer(nextAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0);
  esp_now_add_peer(broadcast_mac, ESP_NOW_ROLE_COMBO, 0, NULL, 0);

#elif defined(ESP32)
  esp_wifi_set_mac(WIFI_IF_STA, &selfAddress[0]);
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  esp_now_peer_info_t peerInfo;
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  // Register peer
  memcpy(peerInfo.peer_addr, nextAddress, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
  memcpy(peerInfo.peer_addr, broadcast_mac, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
#endif
  Serial.println();
  Serial.println("FARM DATA RELAY SYSTEM :: Terminal Module");
  Serial.println("MAC:" + WiFi.macAddress());
  Serial.print("Next device: ");
  Serial.println(NEXT_MAC);
  //  Serial.println(250 / sizeof(DataReading), DEC);
  //  Serial.println(sizeof(DataReading), DEC);
}

void loop() {
  if (newCMD) sendCmd();
  if (millis() > wait_time) {
    wait_time = wait_time + DELAY;
    if (tot_readings != 0) passForward();
  }
}
void passForward() {
  Serial.println("Passing Forward");
  esp_now_send(nextAddress, (uint8_t *) &theData, sizeof(DataReading)*tot_readings);
  tot_readings = 0;
  for (int i = 0; i < 250 / sizeof(DataReading); i++) {
    theData[i].d = 0;
    theData[i].id = 0;
    theData[i].t = 0;
  }
}
void sendCmd() {
  newCMD = false;
  esp_now_send(broadcast_mac, (uint8_t *) &theCommands, tot_commands* sizeof(DataReading));
  tot_commands = 0;
}

Не в сети

#13 28-11-2021 07:10:36

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

С этим кодом, в одной папке должно  лежать две библиотеки. Код приёмника.

#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#define DOUBLEBUFFERING 1
//////////////////////////////////////////////////////////
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <espnow.h>
#elif defined(ESP32)
#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>
#endif
#include "fdrs_config.h"
#include "DataReading.h"
char TEMP[10]="";
char TEMP1[10]="";
uint8_t selfAddress[] = {0x84, 0xCC, 0xA8, 0xB0, 0x78, 0xE7};
uint8_t nextAddress[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, NEXT_MAC};
uint8_t broadcast_mac[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
DataReading incData[31];
DataReading theData[31];
DataReading theCommands[31];
bool newCMD = false;
int wait_time = 0;
int tot_readings = 0;
int tot_commands = 0;
#if defined(ESP8266)
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0) {
    Serial.println("Delivery success");
  }
  else {
    Serial.println("Delivery fail");
  }
}
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
#elif defined(ESP32)
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("Last Packet Send Status:");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
#endif
  uint8_t incMAC[6];
  memcpy(&incData, incomingData, len);
  memcpy(&mac, incMAC, 6);
  //if (memcmp(&incMAC, &nextAddress, 6) == 0)
  int pkt_readings = len / sizeof(DataReading);
  Serial.println(":Packet:");
  for (byte i = 0; i < pkt_readings; i++) {
    Serial.println("SENSOR ID: " + String(incData[i].id) + "  TYPE " + String(incData[i].t) + "  DATA " + String(incData[i].d));
//////////////////////////////////////////////////////ВЫВОД ТЕМПЕРАТУРЫ НА ДИСПЛЕЙ/////////////////////////////////////////////
//////////////////////////////////////////////////////
canvas.clear();
sprintf(TEMP, "%s",String(incData[i].d)+" *C");
canvas.drawTextFmt(0,10,TEMP1);
sprintf(TEMP1, "%s",String(incData[i].d)+" *C");
canvas.drawTextFmt(0,40,TEMP1);
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////  
    if (incData[i].t < 200) {
      if (tot_readings >= 250 / sizeof(DataReading)) {
        Serial.println("ERROR::Too many sensor readings sent within delay period.");
        break;
      }
      theData[tot_readings] = incData[i];  //Save the current incoming reading to the next open packet slot
      ++tot_readings;
    } else {
      theCommands[tot_commands] = incData[i];  //Save the current incoming reading to the next open packet slot
      ++tot_commands;
      newCMD = true;
    }
  }
}

void setup() {
 DisplayController.begin();
DisplayController.setResolution(VGA_320x200_75Hz);
canvas.selectFont(&fabgl::FONT_std_24);
canvas.clear();
canvas.setPenColor(Color::Green);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
canvas.drawTextFmt(0,10,"VGA" );
///////////////////////////////////
  // Init Serial
  Serial.begin(115200);
  // Init WiFi
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  // Init ESP-NOW for either ESP8266 or ESP32 and set MAC address
#if defined(ESP8266)
  wifi_set_macaddr(STATION_IF, selfAddress);
  if (esp_now_init() != 0) {
    return;
  }
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  // Register peer
  esp_now_add_peer(nextAddress, ESP_NOW_ROLE_COMBO, 0, NULL, 0);
  esp_now_add_peer(broadcast_mac, ESP_NOW_ROLE_COMBO, 0, NULL, 0);

#elif defined(ESP32)
  esp_wifi_set_mac(WIFI_IF_STA, &selfAddress[0]);
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_send_cb(OnDataSent);
  esp_now_register_recv_cb(OnDataRecv);
  esp_now_peer_info_t peerInfo;
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  // Register peer
  memcpy(peerInfo.peer_addr, nextAddress, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
  memcpy(peerInfo.peer_addr, broadcast_mac, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
#endif
  Serial.println();
  Serial.println("FARM DATA RELAY SYSTEM :: Terminal Module");
  Serial.println("MAC:" + WiFi.macAddress());
  Serial.print("Next device: ");
  Serial.println(NEXT_MAC);
  //  Serial.println(250 / sizeof(DataReading), DEC);
  //  Serial.println(sizeof(DataReading), DEC);
}

void loop() {
  if (newCMD) sendCmd();
  if (millis() > wait_time) {
    wait_time = wait_time + DELAY;
    if (tot_readings != 0) passForward();
  }
}
void passForward() {
  Serial.println("Passing Forward");
  esp_now_send(nextAddress, (uint8_t *) &theData, sizeof(DataReading)*tot_readings);
  tot_readings = 0;
  for (int i = 0; i < 250 / sizeof(DataReading); i++) {
    theData[i].d = 0;
    theData[i].id = 0;
    theData[i].t = 0;
  }
}
void sendCmd() {
  newCMD = false;
  esp_now_send(broadcast_mac, (uint8_t *) &theCommands, tot_commands* sizeof(DataReading));
  tot_commands = 0;
}

Не в сети

#14 28-11-2021 07:11:05

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

1638058168661220309011497073426.jpg

Не в сети

#15 28-11-2021 07:12:55

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Код библиотеки DataReading.h

typedef struct DataReading {
  float d;
  uint16_t id;
  uint8_t t;

} DataReading;

Не в сети

#16 28-11-2021 07:14:03

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Код библиотеки fdrs_config.h

//  To configure FDRS:

//   Uncomment the code corresponding to the unit you are configuring,
//    then uncomment the code corresponding to the unit you would like
//    to be previous and/or next in the line of communication.

//   Each device in the system has a unique, one-byte address which
//    is assigned to the last digit of its MAC address at startup.

//   Each device is configured to know what the previous and/or next
//    device in the line of communication is.

//   The terminal is considered the "first" device, which can be addressed
//    to a relay or the gateway.

//   Each relay receives data from its pre-programmed "PREV_MAC" device and
//    sends the packet verbatim to the address corresponding to "NEXT_MAC".

//   The gateway receives the data and outputs it as a json string over the serial port.

#define DELAY 15000

// THIS UNIT
#define UNIT_MAC 0x01

// NEXT UNIT
#define NEXT_MAC 0x00 

Не в сети

#17 28-11-2021 07:17:25

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Ну и ссылка на библиотеку FabGL(которая позволяет ESP32 формировать изображение на VGA мониторе).
https://github.com/fdivitto/FabGL
http://www.fabglib.org/

Не в сети

#18 28-11-2021 10:48:33

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

16380712050116819079490499037482.jpg

16380712769251677018866315659518.jpg

Не в сети

#19 28-11-2021 10:49:49

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

16380713277287086098187117805584.jpg

Не в сети

#20 28-11-2021 10:51:09

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,586

Re: Градусник ESP8266+DS18B20+MAX7219 с терминалом/дисплеем VGA на ESP32.

Девайс отправился на испытания. На улице -3,25 на балконе 7 градусов.

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)