Разное о выращивании табака на Алтае
Вы не вошли.
Производитель девайса.
http://www.heltec.cn/project/wifi-lora-32/?lang=en
В данный момент, мой девайс умеет считывать данные с трёх датчиков DS18B20(которые висят на одном порту GPIO - 0), можно хоть 33 таких датчика повешать на один порт. Умеем отображать на встроенном мониторе результаты измерения со всех температурных датчиков и передавать данные на аналогичное устройство по частоте 433 Мгц. Передатчик порядка 100..200 мВт на борту имеется(дуплексный). Дальность принимаемого сигнала, зависит от антенны. От 200м с антенной из комплекта (писюлькой/катушкой) до 10 км с антеннами типа волновой канал(в прямой видимости).
Приёмник, покамест умеет отображать поочерёдно показания каждого температурного датчика.
Не в сети
Код передатчика/основного измерительного и командного устройства.
#include <LoRa.h>
#include <SPI.h>
#include <OneWire.h>//T
#include <DallasTemperature.h>//T
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
#include "images.h"
float t0;
float t1;
float t2;
#define ONE_WIRE_BUS 0//T
#define SDA 4
#define SCL 15
#define RST 16 //RST must be set by software
//----------------
#define SDA 4 // GPIO4 -- SX127x's SDA
#define SCK 5 // GPIO5 -- SX127x's SCK
#define SCL 15 // GPIO15 -- SX127X's SCL
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define RST_LED 16 // GPIO16 -- OLED reset pin
#define LED 25 // GPIO25 -- LED Light pin
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define BAND 433E6 //you can set band here directly,e.g. 868E6,915E6
#define PABOOST true
//-------------------
#define V2 1
#ifdef V2 //WIFI Kit series V1 not support Vext control
#define Vext 21
#endif
//----------------------
unsigned int counter = 0;
//----------------------
//SSD1306 display(0x3c, SDA, SCL, RST);
//-----------------------
SSD1306 display(0x3c, SDA, SCL, RST_LED);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
//-----------------------
#define DEMO_DURATION 3000
typedef void (*Demo)(void);
int demoMode = 0;
//int counter = 1;
int led = 27; // вывод на светодиод
OneWire oneWire(ONE_WIRE_BUS);//T
DallasTemperature sensors(&oneWire);//T
void setup() {
pinMode(led, OUTPUT);//назначем вывод led выходом
pinMode(Vext,OUTPUT);
digitalWrite(Vext, LOW); // OLED USE Vext as power supply, must turn ON Vext before OLED init
delay(50);
Serial.begin(115200);
Serial.println();
Serial.println();
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
//-------------------
pinMode(Vext,OUTPUT);
pinMode(LED,OUTPUT);
digitalWrite(Vext, LOW); // set GPIO16 low to reset OLED
delay(50);
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
// logo();
delay(1500);
display.clear();
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI00);
if (!LoRa.begin(BAND,PABOOST))
{
display.drawString(0, 0, "Starting LoRa failed!");
display.display();
while (1);
}
display.drawString(0, 0, "LoRa Initial success!");
display.display();
delay(1000);
}
void drawFontFaceDemo() {
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "TEMP 18B20");
}
Demo demos[] = {drawFontFaceDemo};
int demoLength = (sizeof(demos) / sizeof(Demo));
long timeSinceLastModeSwitch = 0;
void loop() {
Serial.begin(9600);//T
sensors.begin();//T
sensors.requestTemperatures();//T
Serial.println(sensors.getTempCByIndex(0));
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0,"T0 = " + String(sensors.getTempCByIndex(0)));
display.display();
t0 = (sensors.getTempCByIndex(0));
LoRa.beginPacket();
LoRa.print(t0);
LoRa.endPacket();
sensors.requestTemperatures();//T
display.drawString(0,20,"T1 = " + String(sensors.getTempCByIndex(1)));
display.display();
t1 = (sensors.getTempCByIndex(1));
LoRa.beginPacket();
LoRa.print(t1);
LoRa.endPacket();
sensors.requestTemperatures();//T
Serial.println(sensors.getTempCByIndex(2));
display.drawString(0, 40,"T2 = " + String(sensors.getTempCByIndex(2)));
display.display();
t2 = (sensors.getTempCByIndex(2));
LoRa.beginPacket();
LoRa.print(t2);
LoRa.endPacket();
counter++;
}
Не в сети
Код приёмника.
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "SSD1306.h"
#include "images.h"
#define SCK 5 // GPIO5 -- SX127x's SCK
#define SDA 4 // GPIO4 -- SX127x's SDA
#define SCL 15 // GPIO15 -- SX127X's SCL
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define RST_LED 16 // GPIO16 -- OLED reset pin
#define LED 25 // GPIO25 -- LED Light pin
#define BAND 433E6 //you can set band here directly,e.g. 868E6,915E6
#define PABOOST true
#define V2 1
#ifdef V2 //WIFI Kit series V1 not support Vext control
#define Vext 21
#endif
SSD1306 display(0x3c, SDA, SCL, RST_LED);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
void loraData(){
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawStringMaxWidth(0 ,0 , 128, packet + " C");//!!! ВЫВОД НА ПЕЧАТЬ.
display.display();
}
void cbk(int packetSize) {
packet ="";
packSize = String(packetSize,DEC);
for (int i = 0; i < packetSize; i++) { packet += (char) LoRa.read(); }
rssi = "RSSI " + String(LoRa.packetRssi(), DEC) ;
loraData();
}
void setup() {
pinMode(Vext,OUTPUT);
digitalWrite(Vext, LOW); // set GPIO16 low to reset OLED
delay(50);
display.init();
display.flipScreenVertically();
display.clear();
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI00);
if (!LoRa.begin(BAND,PABOOST)) {
display.drawString(0, 0, "Starting LoRa failed!");
display.display();
while (1);
}
display.drawString(0, 0, "LoRa Initial success!");
display.drawString(0, 10, "Wait for incoming data...");
display.display();
delay(1000);
//LoRa.onReceive(cbk);
LoRa.receive();
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) { cbk(packetSize); }
delay(10);
}
Не в сети
Девайс WiF LoRa 32, умеет питаться автономно от литиевого аккумулятора(кажется должен быть литийполимер) и заряжать аккумулятор от MicroUSB порта(5В) встроенного, на железном уровне.
Планирую в автоматику встроить функции:
1) Отслеживание температуры охлаждающей жидкости и включение электроклапана на подачу воды, при превышении температурного порога. Часть аварийной автоматики.
2) Управление электроклапаном старт/стоп в отборе хвостов.
3) Автоматическое отключение всей системы, при максимальной температуре в кубе/завершение процесса.
4) Разгон куба/переход в режим стабилизированного нагрева куба совместно со стабилизатором напряжения РМ-2.
Ну и естественно, аварийные режимы будут отслеживаться.
Не в сети
Продублировал жёсткую привязку DS18B20 по адресу. Т0. и Т1. - это данные датчика с устройства с точным адресом(позже опишу методику получения адреса каждого датчика DS18B20).
Адреса
DeviceAddress sensor0 = { 0x28, 0x48, 0xE5, 0x45, 0x92, 0x8, 0x2, 0xE };
DeviceAddress sensor1 = { 0x28, 0xAA, 0x49, 0xB1, 0x18, 0x13, 0x2, 0xE3 };
DeviceAddress sensor2 = { 0x28, 0x5F, 0xBE, 0x45, 0x92, 0x8, 0x2, 0x35 };
Печать данных на монитор с адреса DeviceAddress sensor0 = { 0x28, 0x48, 0xE5, 0x45, 0x92, 0x8, 0x2, 0xE };
display.drawString(0, 0,"T0.= " + String(sensors.getTempC(sensor0)));
Код.
#include <LoRa.h>
#include <SPI.h>
#include <OneWire.h>//T
#include <DallasTemperature.h>//T
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
#include "images.h"
float t0;//28 48 E5 45 92 8 2 E
float t1;//28 AA 49 B1 18 13 2 E3
float t2;//28 5F BE 45 92 8 2 35
DeviceAddress sensor0 = { 0x28, 0x48, 0xE5, 0x45, 0x92, 0x8, 0x2, 0xE };
DeviceAddress sensor1 = { 0x28, 0xAA, 0x49, 0xB1, 0x18, 0x13, 0x2, 0xE3 };
DeviceAddress sensor2 = { 0x28, 0x5F, 0xBE, 0x45, 0x92, 0x8, 0x2, 0x35 };
#define ONE_WIRE_BUS 0//T
#define SDA 4
#define SCL 15
#define RST 16 //RST must be set by software
//----------------
#define SDA 4 // GPIO4 -- SX127x's SDA
#define SCK 5 // GPIO5 -- SX127x's SCK
#define SCL 15 // GPIO15 -- SX127X's SCL
#define MISO 19 // GPIO19 -- SX127x's MISO
#define MOSI 27 // GPIO27 -- SX127x's MOSI
#define SS 18 // GPIO18 -- SX127x's CS
#define RST 14 // GPIO14 -- SX127x's RESET
#define RST_LED 16 // GPIO16 -- OLED reset pin
#define LED 25 // GPIO25 -- LED Light pin
#define DI00 26 // GPIO26 -- SX127x's IRQ(Interrupt Request)
#define BAND 433E6 //you can set band here directly,e.g. 868E6,915E6
#define PABOOST true
//-------------------
#define V2 1
#ifdef V2 //WIFI Kit series V1 not support Vext control
#define Vext 21
#endif
//----------------------
unsigned int counter = 0;
//----------------------
//SSD1306 display(0x3c, SDA, SCL, RST);
//-----------------------
SSD1306 display(0x3c, SDA, SCL, RST_LED);
String rssi = "RSSI --";
String packSize = "--";
String packet ;
//-----------------------
#define DEMO_DURATION 3000
typedef void (*Demo)(void);
int demoMode = 0;
//int counter = 1;
int led = 27; // вывод на светодиод
OneWire oneWire(ONE_WIRE_BUS);//T
DallasTemperature sensors(&oneWire);//T
void setup() {
pinMode(led, OUTPUT);//назначем вывод led выходом
pinMode(Vext,OUTPUT);
digitalWrite(Vext, LOW); // OLED USE Vext as power supply, must turn ON Vext before OLED init
delay(50);
Serial.begin(115200);
Serial.println();
Serial.println();
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
//-------------------
pinMode(Vext,OUTPUT);
pinMode(LED,OUTPUT);
digitalWrite(Vext, LOW); // set GPIO16 low to reset OLED
delay(50);
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
// logo();
delay(1500);
display.clear();
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI00);
if (!LoRa.begin(BAND,PABOOST))
{
display.drawString(0, 0, "Starting LoRa failed!");
display.display();
while (1);
}
display.drawString(0, 0, "LoRa Initial success!");
display.display();
delay(1000);
}
void drawFontFaceDemo() {
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "TEMP 18B20");
}
Demo demos[] = {drawFontFaceDemo};
int demoLength = (sizeof(demos) / sizeof(Demo));
long timeSinceLastModeSwitch = 0;
void loop() {
Serial.begin(9600);//T
sensors.begin();//T
sensors.requestTemperatures();//T
Serial.println(sensors.getTempCByIndex(0));
display.clear();
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0,"T0 = " + String(sensors.getTempCByIndex(0)));
display.display();
t0 = (sensors.getTempCByIndex(0));
delay(1000);
display.clear();
display.drawString(0, 0,"T0.= " + String(sensors.getTempC(sensor0)));
LoRa.beginPacket();
LoRa.print(t0);
LoRa.endPacket();
sensors.requestTemperatures();//T
display.drawString(0,20,"T1 = " + String(sensors.getTempCByIndex(1)));
display.display();
t1 = (sensors.getTempCByIndex(1));
delay(1000);
display.clear();
display.drawString(0, 20,"T1.= " + String(sensors.getTempC(sensor1)));
LoRa.beginPacket();
LoRa.print(t1);
LoRa.endPacket();
sensors.requestTemperatures();//T
Serial.println(sensors.getTempCByIndex(2));
display.drawString(0, 40,"T2 = " + String(sensors.getTempCByIndex(2)));
display.display();
t2 = (sensors.getTempCByIndex(2));
delay(1000);
display.clear();
display.drawString(0, 40,"T2.= " + String(sensors.getTempC(sensor2)));
LoRa.beginPacket();
LoRa.print(t2);
LoRa.endPacket();
delay(1000);
//counter++;
}
Не в сети