Разное о выращивании табака на Алтае
Вы не вошли.
Сделал сегодня крутейшую штуку. Градусник состоит из ESP8266 + 2шт DS18B20 + 2ш светодиодных дисплеев MAX7219(можно и одним MAX7219 обойтись, если сделать градусник не сильно точным в индикации).
Не в сети
Не в сети
Градусник может измерять/отображать температуру с двух датчиков DS18B20 и передавать данные по протоколу ESP NOW(через свой WiFi передатчик) на другой микропроцессор/приёмник ESP8266/ESP32 без формирования локальной сети/без соединения с общей сетью/вообще без Интернета идёт передача данных.
Не в сети
Протокол передачи данных ESP NOW в диапазоне WiFi, есть уникальная разработка Espressif Systems. Очень быстрый и дальнобойный протокол для передачи коротких сообщений. Дальность пока не измерял, но с не большими внешними антеннами, дальность доходит до 500 метров(по отзывам в сети).
Не в сети
ESP8266 получает данные с градусников DS18B20 и транслирует их на свои светодиодные дисплеи MAX7219. Далее, ESP8266 передаёт данные на терминал/приёмник/ESP32. ESP32 принимает данные и выводит их на стандартный VGA монитор.
Не в сети
Не в сети
Не в сети
Победить протокол Esp Now, помогли труды человека под ником timmbogner на Гитхабе.
https://github.com/timmbogner/Farm-Data-Relay-System
За основу передачи данных, был взят его код. Мучился с проблемой несколько месяцев и вот получилось!
Не в сети
Код градусника на 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);
}
Не в сети
+ библиотека коротенькая, которая должна лежать в одной папке с кодом в предыдущем посту с именем DataReading.h
typedef struct DataReading {
float d;
uint16_t id;
uint8_t t;
} DataReading;
Не в сети
Не в сети
Код терминала на 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;
}
Не в сети
С этим кодом, в одной папке должно лежать две библиотеки. Код приёмника.
#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;
}
Не в сети
Не в сети
Код библиотеки DataReading.h
typedef struct DataReading {
float d;
uint16_t id;
uint8_t t;
} DataReading;
Не в сети
Код библиотеки 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
Не в сети
Ну и ссылка на библиотеку FabGL(которая позволяет ESP32 формировать изображение на VGA мониторе).
https://github.com/fdivitto/FabGL
http://www.fabglib.org/
Не в сети
Не в сети
Не в сети
Девайс отправился на испытания. На улице -3,25 на балконе 7 градусов.
Не в сети