#1 21-02-2019 02:43:28

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

Автоматика Алтай 50 на базе WiFi LoRa 32(ESP32).

Производитель девайса.
http://www.heltec.cn/project/wifi-lora-32/?lang=en
В данный момент, мой девайс умеет считывать данные с трёх датчиков DS18B20(которые висят на одном порту GPIO - 0), можно хоть 33 таких датчика повешать на один порт. Умеем отображать на встроенном мониторе результаты измерения со всех температурных датчиков и передавать данные на аналогичное устройство по частоте 433 Мгц. Передатчик порядка 100..200 мВт на борту имеется(дуплексный). Дальность принимаемого сигнала, зависит от антенны. От 200м с антенной из комплекта (писюлькой/катушкой) до 10 км с антеннами типа волновой канал(в прямой видимости).
Приёмник, покамест умеет отображать поочерёдно показания каждого температурного датчика.

006.jpg

007.jpg

008.jpg

009.jpg

010.jpg

Не в сети

#2 21-02-2019 03:20:01

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

Re: Автоматика Алтай 50 на базе WiFi LoRa 32(ESP32).

Код передатчика/основного измерительного и командного устройства.

#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++;
}

Не в сети

#3 21-02-2019 03:21:32

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

Re: Автоматика Алтай 50 на базе WiFi LoRa 32(ESP32).

Код приёмника.

#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);
}

Не в сети

#4 21-02-2019 03:31:09

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

Re: Автоматика Алтай 50 на базе WiFi LoRa 32(ESP32).

Девайс WiF LoRa 32, умеет питаться автономно от литиевого аккумулятора(кажется должен быть литийполимер) и заряжать аккумулятор от MicroUSB порта(5В) встроенного, на железном уровне.
Планирую в автоматику встроить функции:
1) Отслеживание температуры охлаждающей жидкости и включение электроклапана на подачу воды, при превышении температурного порога. Часть аварийной автоматики.
2) Управление электроклапаном старт/стоп в отборе хвостов.
3) Автоматическое отключение всей системы, при максимальной температуре в кубе/завершение процесса.
4) Разгон куба/переход в режим стабилизированного нагрева куба совместно со стабилизатором напряжения РМ-2.
Ну и естественно, аварийные режимы будут отслеживаться.

Не в сети

#5 23-02-2019 03:28:03

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

Re: Автоматика Алтай 50 на базе WiFi LoRa 32(ESP32).

Продублировал жёсткую привязку 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++;
}

Не в сети

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

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