Разное о выращивании табака на Алтае
Вы не вошли.
Использование протокола ESP_NOW, стырено тут.
https://github.com/timmbogner/Farm-Data-Relay-System
Не в сети
Не в сети
На дисплее 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));
}
Не в сети
Приёмник. Библиотеки должны быть с приёмником в папке.
Основное тело программы.
#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
Не в сети
Не в сети