#1 27-12-2021 02:48:27

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

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

Использование протокола ESP_NOW, стырено тут.
https://github.com/timmbogner/Farm-Data-Relay-System

Не в сети

#2 27-12-2021 02:55:07

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

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

Сам градусник/передатчик. 3шт ds18b20.


164054848141343880027329588643.jpg

Не в сети

#3 27-12-2021 02:59:00

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

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

На дисплее MAX7219 отображаются температуры двух датчиков. Температура всех трёх датчиков отправляется по протоколу Esp_Now на терминал/приёмник.

Не в сети

#4 27-12-2021 02:59:47

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

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

Специально сделал навесной монтаж без материнской платы(для не владеющих технологией ЛУТ). Потом нарисую простую схему монтажа. Нужно, только правильно проводки спаять и загрузить программу под Arduino IDE.
16405487624223067028072621041627.jpg

Не в сети

#5 27-12-2021 03:25:13

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

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

Код передатчика температуры трёх ds18b20. Для чипа 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);
 float tempC2 = sensors.getTempCByIndex(2);
  Serial.println(tempC2);
  DataReading Temp;
  Temp.id = READING_ID;
  Temp.t = 1;
  Temp.d = tempC;
  esp_now_send(broadcastAddress, (uint8_t *) &Temp, sizeof(Temp));
  DataReading Temp1;
  Temp.id = READING_ID;
  Temp.t = 1;
  Temp.d = tempC1;
  esp_now_send(broadcastAddress, (uint8_t *) &Temp, sizeof(Temp1));
  ld.print(String(tempC,2)+" "+String(tempC1,1), 0);
///////////////////////////////////////
DataReading Temp2;
Temp.id = READING_ID;
  Temp.t = 1;
  Temp.d = tempC2;
esp_now_send(broadcastAddress, (uint8_t *) &Temp, sizeof(Temp2));
}

Не в сети

#6 27-12-2021 03:48:42

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

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

Приёмник. Библиотеки должны быть с приёмником в папке.
Основное тело программы.

#include <stdio.h>
#include "fabgl.h"
fabgl::VGAController DisplayController;
fabgl::Canvas        canvas(&DisplayController);
#include <esp_now.h>
#include <WiFi.h>
#include <esp_wifi.h>
#include "fdrs_config.h"
#include "DataReading.h"
char TEMP[10]="";
char TEMP1[10]="";
char TEMP2[10]="";
char Tcol[20]="";
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;
int i1=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(5,5,TEMP);
delay(1900);
//////////////////////////////////////////////////////////////////  
    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_640x200_70Hz);
canvas.selectFont(&fabgl::FONT_std_24);
canvas.clear();
canvas.setPenColor(Color::Green);
canvas.setGlyphOptions(GlyphOptions().FillBackground(false).DoubleWidth(1));
canvas.setBrushColor(RGB888(0,255,0));//цвет залитого прямоугольника
canvas.fillRectangle(10, 10, 100, 100);//залитый прямоугольник
// Paint a yellow rectangle with blue border
canvas.setPenColor(Color::BrightBlue);//цвет рамки
canvas.setBrushColor(Color::BrightGreen);//цвет залитого прямоугольника
canvas.fillRectangle(100, 100, 300, 400);
canvas.drawRectangle(1, 1, 639, 199);//рамка
delay(1000);
canvas.setBrushColor(RGB888(0,0,0));//цвет залитого прямоугольника/фона
canvas.setPenColor(Color::BrightGreen);//цвет текста
///////////////////////////////////
  // 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 Ramka()
{
  canvas.setPenColor(Color::BrightBlue);//цвет рамки
canvas.drawRectangle(1, 1, 639, 199);//рамка
canvas.setPenColor(Color::BrightGreen);//цвет текста
}
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;
}

Библиотекa.(DataReading.h)

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

} DataReading;

Библиотека  fdrs_config.h

#define DELAY 15000

// THIS UNIT
#define UNIT_MAC 0x01

// NEXT UNIT
#define NEXT_MAC 0x00 

Не в сети

#7 27-12-2021 04:10:41

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

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

Приёмник на esp32 c VGA  монитором.
16405529897392157673808402989993.jpg

Не в сети

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

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