Сервер гонщика Формулы C2H5OH

Доброго времени суток дамы и господа!

Начну издалека – я гоню самогон на некотором расстоянии от дома, в беседке. Соответственно контролировать процесс, особенно зимой, затруднительно: Куда-то идти, смотреть… Для выравнивания этой ситуации был создан недопроект на 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 — Яндекс Диск

1 лайк

ОТА не было желания прикрутить?

Таки, освоили Android Studio? Или на чем то другом APK собрана?

Пока нет. Криво всё пока. Но как развитие - возможно.

Освоил малость Android Studio. Эклипс ужо очень требовательный.

А вот идея отслеживания наполнения банки самогоном меня не оставляет, но на каком физическом принципе это сделать (ультразвук, свет или поплавок) я пока не знаю. Чтобы конкретно и правильно.

Тензодатчик?


Зачем ОТА? WebUpdater из комплекта поставки - и обновлять из браузера :slightly_smiling_face:

А нахера? Вы и правда уверены, что софтина под ESP32 будет так часто меняться?

Для удобства. Там три (буквально) строчки кода

Я Вас буквально “за язык поймал”. Три строчки в студию! Нахера - не знаю, но мужик сказал - мужик сделал :frowning:

Просто добавляются три строки

#include <HTTPUpdateServer.h>

HTTPUpdateServer httpUpdater;

void setup()
{
  httpUpdater.setup(&httpServer);
}

Естественно, web-сервер на esp должен быть поднят. Работает по http://esp_ip/update. Можно сделать вход по логину/паролю

httpUpdater.setup(&httpServer, "admin", "12345");

А можно и адрес обновления задать

httpUpdater.setup(&httpServer, "/firmware", "admin", "12345");

В общем, любой каприз

Огромное человеческое спасибо за широту и щедрость души Вашей, сам то я не пью, но к чему-то другому проект сей можно приспособить

так нас уже как минимум двое )))

1 лайк

Удивляюсь как вы в России живёте :crazy_face: :slight_smile:

1 лайк

я надеюсь, что интересно живём )))

А зачем ты выкинул управление нагревом и отбором? Оно ж у меня было самым главным!
Или клапан отбора уже за баПки? Тогда мои 50%!!! :wink:

Граф, ну как Вы можете подозревать в столь низком мздоимстве! Только в высоком!
(Ц…с - Вы просили Вас не упоминать)
А поскольку мне, в моём аппарате, этот узел был ненужен - я его вырезал.
Так что если нужна регуляция - это к графу. Он направит, объяснит, крови малость попьёт (не без этого), но будет сказка, а не аппарат!
Глубокий поклон графу за пинок в нужную сторону!

как как, скетч не компилируется, 115 строка непонятна…100-500 мздоимство