Доброго времени суток дамы и господа!
Начну издалека – я гоню самогон на некотором расстоянии от дома, в беседке. Соответственно контролировать процесс, особенно зимой, затруднительно: Куда-то идти, смотреть… Для выравнивания этой ситуации был создан недопроект на ESP32, который создавал недоwebстраничку. Но лень гонит нас дальше – недоwebстраничка не умеет оповещать о событиях (или я этого не умею). И решил я создать оболочку для андроида, которая будет отслеживать и оповещать. Получилось криво-косо, но работает.
Требования:
Видеокарта Gtx750ti 2 ГБ GDDR5 2,0 бит PCIE 5400 1020 МГц (шутю)
Андроид не ниже 8
И всё
Теперь о программе – НИЧЕГО в строках с 109 по 149 ничего не менять.
Если нет какого-то датчика T1-T3 – назначайте температуру константой в сетапе.
У меня 2 датчика Pt1000 с MAX31865 только потому, что датчики DS18B20 не влезают в отверстия моего самогонного аппарата (если вы будете использовать Pt1000, то надо будет на плате MAX31865 поменять резистор 470Ом на 4,7кОм). Датчик теплоносителя - DS18B20 так что можно полностью перейти на DS18B20.
Софт:
/***************************************************
ESP32DevModule
Считывание двух MAX31865 с PT1000 датчиками и передача информации
на I2C LCD 16x2 и по WIFI.
****************************************************/
#include <SPI.h>
#include <Adafruit_MAX31865.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // на него ругается, но работает
#include <WiFi.h>
LiquidCrystal_I2C lcd(0x27,16,2); // LCD address to 0x27
// Софтварный SPI пины: CS, DI, DO, CLK
Adafruit_MAX31865 thermo1 = Adafruit_MAX31865(5, 23, 19, 18);
Adafruit_MAX31865 thermo2 = Adafruit_MAX31865(17, 23, 19, 18);
// Сопротивление резистора Rref. 430.0 Ом для PT100 и 4300.0 Ом для PT1000
#define RREF 4300.0
// Сопротивление резистора при 0С
// 100.0 для PT100, 1000.0 для PT1000
#define RNOMINAL 1000.0
//Датчик DS18B20 на порту 13
#define ONE_WIRE_BUS 27
// вводим имя и пароль точки доступа
const char* ssid = "kaida";
const char* password = "***********";
OneWire oneWire(ONE_WIRE_BUS);
//Инициализируем DS18B20
DallasTemperature sensors(&oneWire);
// инициализируем сервер на 80 порте
WiFiServer server(80);
// заводим буфер и счетчик для буфера
char lineBuf[80];
int charCount = 0;
const int diode = 14; //Диод, чтобы мигал и радовал глаз
unsigned long lastMillis;
float Term1;
float Term2;
float Term3;
//****************************** Вывод на экран T*******************
void lcdPrintT(float Tt, int nom){
lcd.setCursor(0,nom-1);
lcd.print("T");
lcd.print(nom);
lcd.print(" = ");
lcd.print(Tt);
lcd.print("C");
}
void setup() {
Wire.begin(22,21); //Запускаем I2C (SLC, SDA) (в принцыпе можно на любых пинах, взял аппаратные)
lcd.init(); // Инициализируем lcd
lcd.backlight(); //Включаем подсветку
lcd.clear(); //Очищаем экран
Serial.begin(115200);
thermo1.begin(MAX31865_2WIRE); // Сколько проводов от датчика (2 или 4) 2WIRE или 4WIRE
thermo2.begin(MAX31865_2WIRE); // Сколько проводов от датчика (2 или 4) 2WIRE или 4WIRE
pinMode(diode, OUTPUT);
digitalWrite(diode,HIGH);
// подключаем микроконтроллер к Wi-Fi сети
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wi-Fi connected");
Serial.println("IP-address: ");
Serial.println(WiFi.localIP());
// запускаем сервер
server.begin();
lastMillis=millis();
}
void loop() {
if ((millis()-lastMillis)>= 5000) { // считываем и выдае данные раз в 5 секунд
lastMillis=millis();
sensors.requestTemperatures();
Term1=thermo1.temperature(RNOMINAL, RREF); //температура 1 датчика
Term2=thermo2.temperature(RNOMINAL, RREF); //температура 2 датчика
Term3=sensors.getTempCByIndex(0);
if(Term3 == DEVICE_DISCONNECTED_C)Term3=-50.;
Serial.print("Temperature1 = "); Serial.println(Term1);
Serial.print("Temperature2 = "); Serial.println(Term2);
Serial.print("Temperatur3 = "); Serial.println(Term3);
lcdPrintT(Term1,1);
lcdPrintT(Term2,2);
digitalWrite(diode,!digitalRead(diode));
}
// анализируем канал связи на наличие входящих клиентов
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
memset(lineBuf, 0, sizeof(lineBuf));
charCount = 0;
// HTTP-запрос заканчивается пустой строкой
boolean currentLineIsBlank = true;
while (client.connected()) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// формируем веб-страницу
String webPage = "<!DOCTYPE HTML>";
webPage += "<html>";
webPage += " <head>";
webPage += " <meta name=\"viewport\" content=\"width=device-width,";
webPage += " initial-scale=1\">";
webPage += " </head>";
webPage += " <h1>SAMOGON Server</h1>";
webPage += " <p>";
webPage += " T1 = ";
webPage += Term1;
webPage += " <br>";
webPage += " T2 = ";
webPage += Term2;
webPage += " <br>";
webPage += " T3 = ";
webPage += Term3;
webPage += " <br>";
webPage += " </p>";
webPage += "</html>";
client.println(webPage);
break;
}
// даем веб-браузеру время для получения данных
delay(1);
// закрываем соединение
client.stop();
Serial.println("client disconnected");
}
}
ESP32 должно находится во ВНУТРЕННЕЙ сети роутера 192.168.. и советую сразу закрепить за ним адрес, чтобы его не искать.
Опрос ESP32 происходит каждые 5 секунд.
Теперь картинки:
Софтину для андроида кладу на внешнем ресурсе Samogon.apk — Яндекс Диск