Перейти к содержанию
VALKNUT

Ардуино в помощь аквариуму

Рекомендуемые сообщения

VALKNUT    5072

Собратья и сосёстры, дратути!
Хочу поделиться прошивкой для LUX метра, на основе датчика VEML7700 и микроконтроллера ARDUINO NANO (и то и другое дешевле на алике в 2-4 раза)
Это очень простое в реализации решение, но есть нюансы.
1. Гермитизировать сам датчик от воды
2. Придумать корпус для устройства
3. Воплотить в граните =)

У меня есть 2 "поциента" :ap: (семейство @shkush и @Камень), которым я сделаю этот девайс и отошлю, но это не серийное производство, да и не ширптреб, оно нужно тем, кто знает ЧТО с ним делать..

Понадобится (по минималке):
1. датчик VEML7700
2. контроллер Arduino NANO
3. дисплей SH1106
4. готовый код и шнурок USB
 

Спойлер

#include <Arduino.h>
#include <U8g2lib.h>
#include "Adafruit_VEML7700.h"
#include <Wire.h>

U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
Adafruit_VEML7700 veml = Adafruit_VEML7700();

unsigned long previousMillis = 0;
const long interval = 2000;

void setup()   {
  Serial.begin(115200);
  Serial.println(F("Start!"));

  u8g2.begin();
  u8g2.setDisplayRotation(U8G2_R2);
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_luIS19_tf);
  u8g2.firstPage();
  do {
    u8g2.setCursor(16, 40);
    u8g2.print(F("AQLUX"));
  } while ( u8g2.nextPage() );
  u8g2.sendBuffer();
  delay(2000);

  veml.begin();
  if (veml.begin() == false) {
    StartErr();
    while (1);
  } else {
    StartUp();
    opros();
  }
}

void StartErr() {
  u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
  u8g2.firstPage();
  do {
    u8g2.setCursor(24, 20);
    u8g2.print(F("VEML7700"));
    u8g2.setCursor(40, 40);
    u8g2.print(F("ERROR"));
  } while ( u8g2.nextPage() );
}

void StartUp() {
  u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
  u8g2.firstPage();
  do {
    u8g2.setCursor(24, 20);
    u8g2.print(F("VEML7700"));
    u8g2.setCursor(40, 40);
    u8g2.print(F("FOUND"));
  } while ( u8g2.nextPage() );
}

void opros() {
  float lux = veml.readLux(VEML_LUX_AUTO);
  Serial.print("LUX: "); Serial.print(lux);
  Serial.print(", WHT: ");
  Serial.print(veml.readWhite());
  Serial.print(", ALS: ");
  Serial.println(veml.readALS());

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
    u8g2.setCursor(90, 12);
    u8g2.print(F("-WHT"));
    u8g2.setCursor(2, 12);
    u8g2.print(veml.readWhite());
    u8g2.setCursor(90, 52);
    u8g2.print(F("-ALS"));
    u8g2.setCursor(2, 52);
    u8g2.print(veml.readALS());
    
    u8g2.setCursor(2, 32);
    u8g2.print(F("Lx"));

    u8g2.setFont(u8g2_font_profont29_mn);
    u8g2.setCursor(28, 37);
    if (lux > 99 ) {
      u8g2.print(lux, 0);
    } else {
      u8g2.print(lux);
    }
  } while ( u8g2.nextPage() );
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros();
  }
}

 

На максималках можно добавить аккумулятор, DC-DC повышайку и зарядку аккумулятора от USB (мой прототип так и сделан)

Основная проблема, это гермитизация датчика, чтоб его можно было опустить под воду и получит данные там, где это востребовано.
Свой "прототип" я долго держал в столе и никак его не юзал, но прикупив прозрачную эпоксидку, решил возобновить эксперименты.. удачно!
На данном этапе нужно произвести юстировку "в смоле"/"as is". То есть сделать поправку на потери LUX в эпоксидной смоле и программно эту разницу компенсировать.

 

  • Лайк 3

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

Один концепт готов..
Без экрана, без батарей, без повышаек и контроллеров зарядки... просто и надежно.

Датчик + контроллер + приложение на смартфоне (Любое из семейства USBTerminal)..
image.jpg.8602e3482d39fdc5bdfb7577c93fb511.jpg

Так же на компе, используя любой терминал, я предпочитаю PuTTY
image.jpg.ca630c168d38186dd2d9c142d3eafc46.jpg

image.jpg.a27428463cbc653479cc1df8fe93f7f4.jpg

Что "показывает" датчик:
LUX: освещенность (амбиент)
WHT: только белый свет
ALS: рассеянный свет, закос под восприятие человеческим глазом

  • Лайк 2

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

Провел тестирование.. датчиков: залитый прозрачной эпоксидкой и "голый" датчик //в одинаковых условиях.
Отличие на улице 8,7%, отличие в помещении 11,8%, то есть грубо говоря 10% съедает эпоксидка. 
Убрал лишнее WHT и ALS, они используются для корректировок LUX, в зависимости от освещенности и практической пользы для конечного пользователя не имеют.

image.jpg.b5af1c110ae6c141bda70129ae52b336.jpg
Это под лампой на рабочем месте =)

  • Лайк 2

Поделиться сообщением


Ссылка на сообщение
Lx671    440
18 часов назад, VALKNUT сказал(а):

Датчик + контроллер + приложение на смартфоне (Любое из семейства USBTerminal)..

Над народом не издевайся)) Для них это "темный лес".

WEB-лист простейший как сервак пропиши вместо дисплея. И не надо ни приложений ни шнурков странных...

Поделиться сообщением


Ссылка на сообщение
AlexLi    7040
5 минут назад, Lx671 сказал(а):

Над народом не издевайся)) Для них это "темный лес".

 

Батл назревает)))

  • Хи-хи-хи 2

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
24 минут назад, Lx671 сказал(а):

WEB-лист простейший как сервак пропиши вместо дисплея. И не надо ни приложений ни шнурков странных...

Алексей, я искренне уважаю ваш опыт (мамай клянус), но иногда я просто не понимаю что Вы пишите. Буквы понимаю, содержание нет.

Веб-лист.. что за нах Веб-лист???? Какой нафиг "сервак" для пользователя со знанием электроники (науки о контактах) ниже ПТУ, зачем давать ЛИШНЕЕ?
Вот Вы (честно, реально, 100%) для меня являетесь "тем самым" (Киано Ривз - Матрица) в своих изысканиях - Вы очень молодец! (откровенно).
Но у нас есть сообщество, которое может (если захочет) изучить предоставляемый нами с вами "трэш" (типа информацию) и попытается что-то сделать своими руками..

Алексей, положите руку на сердце или на любое другое место (по выбору) и скажите, только честно.. с нулевыми знаниями Вы (как участник форума) бы стали повторять свои же собственные наработки "с кембриками" и транзисторами "МП42"?  Понимаете к чему я веду?

Дайте НАРОДУ повторяемый "ништяк" и помогите реализовать, а не дайте ЛУЗЕРАМ неповторимость своего превосходства.
Надо ПОМОГАТЬ, а не ВИНОВАТИТЬ (что не понимают).

Грубо говоря, Вы ведете себя крайне эгоцентрично.

Мы тут, между прочим - сообщество = банда! Не можете подтянуть, не опускайте. Я всё сказал.  

20 минут назад, AlexLi сказал(а):

Батл назревает)))

Я со своего форума трех попов изжил знанием темы, баттла не будет, не тот "потенциал разности напряжений" :ap:
Хотя... я давно попов не изгонял из светского форума :blush2: лет 10...

Поделиться сообщением


Ссылка на сообщение
AlexLi    7040
12 минут назад, VALKNUT сказал(а):

Алексей, я искренне уважаю ваш опыт (мамай клянус), но иногда я просто не понимаю что Вы пишите. Буквы понимаю, содержание нет.

Веб-лист.. что за нах Веб-лист???? Какой нафиг "сервак" для пользователя со знанием электроники (науки о контактах) ниже ПТУ, зачем давать ЛИШНЕЕ?
Вот Вы (честно, реально, 100%) для меня являетесь "тем самым" (Киано Ривз - Матрица) в своих изысканиях - Вы очень молодец! (откровенно).
Но у нас есть сообщество, которое может (если захочет) изучить предоставляемый нами с вами "трэш" (типа информацию) и попытается что-то сделать своими руками..

Алексей, положите руку на сердце или на любое другое место (по выбору) и скажите, только честно.. с нулевыми знаниями Вы (как участник форума) бы стали повторять свои же собственные наработки "с кембриками" и транзисторами "МП42"?  Понимаете к чему я веду?

Дайте НАРОДУ повторяемый "ништяк" и помогите реализовать, а не дайте ЛУЗЕРАМ неповторимость своего превосходства.
Надо ПОМОГАТЬ, а не ВИНОВАТИТЬ (что не понимают).

Грубо говоря, Вы ведете себя крайне эгоцентрично.

Мы тут, между прочим - сообщество = банда! Не можете подтянуть, не опускайте. Я всё сказал. 

я мало что понял по существу, но по ощущениям ты прав на 100%!)))

главное, что я понял: мы-банда, и это радует!

  • Хи-хи-хи 2

Поделиться сообщением


Ссылка на сообщение
Lx671    440
1 час назад, VALKNUT сказал(а):

но иногда я просто не понимаю что Вы пишите. Буквы понимаю, содержание нет.

Ну вы не парьтесь с этим. У меня IQ такое низкое, что за 30 лет в связи мне обычно сливали чужестранные разработки, которые должны стыковаться с нашими, в общем вы правы, я в банде не работаю)) Ни кто не понимает))

1 час назад, VALKNUT сказал(а):

что за нах Веб-лист???? Какой нафиг "сервак" для пользователя со знанием электроники

Теперь по существу. --Эта ветка начиналась с настройки среды под ESP...у которых на борту Wi-Fi, а на кой вы начали грузить более старой платой?

Если вы кидаете исходник, то его должны загрузить с компа, при этом установить правильно среду и плагины. 

1 час назад, VALKNUT сказал(а):

Дайте НАРОДУ повторяемый "ништяк" и помогите реализовать,

Ну вы хотите, чтобы неподготовленный народ припаял датчик к плате, нашел шнур телефон-плата, а перед этим прошил с компа другим шнуром, как я понял.

У многих компа нет((

Повторяемый - это вы спаиваете, прописываете, присылаете. Может в коробку засунуть смогут. 

Вот страница для сервера - https://rvideo-kaluga.ru/sho/ba0525a.htm  она переспрашивает сама себя (с платы ESP), ее можно несложно переделать под люксы.

А для соединения с телефоном, ESP можно просто включить через зарядник. А в телефоне найти Wi-Fi от платы ESP (вы его вводите) и в браузере просто набрать IP, который вы пропишите.

2 часов назад, VALKNUT сказал(а):

Не можете подтянуть, не опускайте.

???  У каждого свое направление. Профессии разные. При чем тут "опускать".  Я много другого не знаю, обои клеить не умею вообще))

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
1 час назад, Lx671 сказал(а):

При чем тут "опускать".  Я много другого не знаю, обои клеить не умею вообще))

Я к тому, что надо подсказать КАК, а не рассказать почему только ТЫ можешь.
Почувствуй разницу.
Надо нести ЗНАНИЯ в массы (примеры, для повторения), а не делать из себя "форму для феонита, чтоб как брилиант".. понятно объясняю?

Если кратко, народам нужен воспроизводимый эксперимент, а не "мазоль" от ника, который как божество с кембриками и дурацкими "Вебинтерфесами".
Прошу прощения, считаю Ваши наработки интересными, но убогими, в плане реализации/привлекательности. Я бы, себе подобные вашим "интерфейсы" занулил на стадии разработки.
Надо делать такое, что повторить могла и милфа.

Поделиться сообщением


Ссылка на сообщение

VALKNUT    5072
13 часов назад, Lx671 сказал(а):

Теперь по существу. --Эта ветка начиналась с настройки среды под ESP...у которых на борту Wi-Fi

Если уж по существу, то тема называется (дословно) "Ардуино в помощь аквариуму" :ap:

13 часов назад, Lx671 сказал(а):

а на кой вы начали грузить более старой платой?

Эта "более старая плата" называется Arduino Nano, что даже в большей мере соответствует теме, чем те же контроллеры ESP.  Более того, производство и поддержка этих контроллеров продолжается и они востребованы многими разработчиками, что в переводе с буржуйского "спрос рождает предложение". 
Более того, выбирая тот или иной контроллер для определенной задачи, лучше руководствоваться здравым смыслом. Для конкретно этой задачи: - "получить данные с датчика VEML7700 и предоставить их пользователю" я выбрал самый простой и доступный контроллер Arduino Nano. У меня есть и ESPшки разного калибра и Ардуинки (Уно и Мега), но забивать гвозди микроскопом = такое себе...

Поделиться сообщением


Ссылка на сообщение
AlexLi    7040

@VALKNUT а говорил, что батла не будет, обманщик)))

  • Хи-хи-хи 2

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

Немного допилил код для Arduino Nano (без собственного экрана, с выводом на смартфон/компьютер)
- Добавил возможность внести коррекцию из консоли терминала в % и сохранить значение в энергонезависимую память (EEPROM).
// Коррекция нужна для датчиков в "подводном" исполнении, т.к. любой прозрачный материал между датчиком и источником света является преградой для света и данные от "открытого" и "залитого" датчиков будут разными.

Код для Arduino IDE (среда разработки) для простейшего контроллера Arduino Nano. Тем, кто хочет сам поиграться и/или модифицировать под свои нужды.

Спойлер

 

 


#include <EEPROM.h>
#include "Adafruit_VEML7700.h"

#define LOAD_VALUE_PARAMNAME_1        EEPROM.read(0)
#define SAVE_VALUE_PARAMNAME_1(value) EEPROM.update(0, value)

Adafruit_VEML7700 veml = Adafruit_VEML7700();

unsigned long previousMillis = 0;
long interval = 2000;
byte myPrc = 10;

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(5);

  veml.begin();
  if (veml.begin() == false) {
    Serial.println(F("VEML7700 not found!"));
    while (1)
      ;
  } else {
    Serial.println(F("AQLUX start, VEML7700 found!"));
    loadParams();  // Чтение из EEPROM
    showParams();  // Отображение прочитанного в мониторе порта
    opros();
  }
}

void loadParams() {
  myPrc=LOAD_VALUE_PARAMNAME_1;
}

void showParams() {
  Serial.println("Correction: " + String(myPrc) + "%");
}

void opros() {
  float lux = veml.readLux(VEML_LUX_AUTO);
  Serial.print(F("LUX: "));
  if (myPrc == 0) {
    Serial.println(lux);
  } else {
    Serial.println(lux + (lux * myPrc / 100));
  }
}

void loop() {
  if (Serial.available()) {
    String s = Serial.readStringUntil("%");
    myPrc = s.toInt();
    if (s.toInt() > 255) myPrc = 100;
    if (s.toInt() < 100) {
      SAVE_VALUE_PARAMNAME_1(myPrc);
    } else {
      Serial.println(F("ERROR: <100%!!!"));
      myPrc = 100;
    }
    showParams();
  }

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros();
  }
}

 

 

На смартфоне я использую такое вот приложение. (Simple Serial Port)

Спойлер

image.thumb.png.4901528bfc304e639f3c2d40af05eae2.png
На скрине:
- запуск приложения
- чтение коррекции из памяти (Correct: 15%)
- вывод данных датчика
- отправка новой коррекции в терминал "11%" /происходит и запись в память/
- чтение коррекции из памяти (Correct: 11%)
- вывод данных датчика

На компе (стандартными средствами) сложней передать данные для коррекции, но прочитать очень легко.

Спойлер

 

Чтоб читать данные из порта, на котором висит "устройство" необходимо:
1. Узнать номер этого COM порта.
Нажимаем [Win]+[R], вводим в форму cmd и нажимаем [Enter].
Откроется консоль Windows, в которую можно вставить следующий текст команды (здесь можно скопировать, а вставляется текст в консоль однократным щелчком правой кнопки мышки)


reg query HKLM\HARDWARE\DEVICEMAP\SERIALCOMM

После выполнения команды (по кнопке [Enter]
Получаем список активных портов..


C:\Users\***>reg query HKLM\HARDWARE\DEVICEMAP\SERIALCOMM

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
    \Device\Serial0    REG_SZ    COM1
    \Device\VCP0    REG_SZ    COM9


C:\Users\***>

Нужный порт COM9

2. Не закрывая консоль вводим команду настройки порта. Скорость, четность, битность, градус, оборот... /и нажимаем [Enter]


mode COM9 BAUD=115200 PARITY=n DATA=8

Выйдет вот такая техническая информация 


C:\Users\***>mode COM9 BAUD=115200 PARITY=n DATA=8

Состояние устройства COM9:
---------------------------
    Скорость:              115200
    Четность:              None
    Биты данных:           8
    Стоповые биты:         1
    Таймаут:               OFF
    XON/XOFF:              OFF
    Синхронизация CTS:     OFF
    Синхронизация DSR:     OFF
    Чувствительность DSR:  OFF
    Цепь DTR:              ON
    Цепь RTS:              ON


C:\Users\***>


3. И теперь, чтоб получить данные с устройства вводим в ту же консоль /и нажимаем [Enter]


TYPE COM9

Теперь в консоль сыпятся данные от устройства.. для отключения от COM порта используется команда [Ctrl]+[C] 


C:\Users\***>TYPE COM9
AQLUX start, VEML7700 found!
Correction: 0%
LUX: 147.65
LUX: 147.17
LUX: 146.70
LUX: 147.17
LUX: 147.17
Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.

C:\Users\***>

 

 

 


Сторонние приложения более гибкие, но уже не являются стандартными средствами.

Спойлер

 

Например приложение "Serial Port Terminal" /бесплатная программа/
image.thumb.png.792b57ee48f191c8a37b4c475260327b.png

Позволяет и читать и писать в порт и подключаться не сложно, в общем.. покажу на скриншотах..
Настройка порта
image.jpg.0b0a91509fa87975532012244efd1050.jpg

Подключение и работа
image.thumb.png.cda5d54dd8e0771f92bb9d1dae8c5a3b.png

 

 

 

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

Время социальных ограничений привело меня к заботе: как получать уведомления от серверов, роутеров И! Аквариумов (Arduino и ESP), в Мах, вместо упокоенного Телегушки?

На данный момент в Мах мне уже приходит информация из Windows, из Linux и из RouterOS (роутеры MikroTik). Осталось отправить хоть одно сообщение из ESP32 и для меня этот "переломный" момент можно считать закрытым.
RouterOS
image.thumb.png.88319c3a937560cd2e7a30e46594f4ee.png

cURL Windows (cmd)
image.thumb.png.22ca9a9bc223affa7cb455142f911e99.png

cURL Linux (bash)
image.thumb.png.4b6e1fbf4d1add27e5d8262a8e9cf1e2.png

Но! Пока есть куча но. И желание заборцевать их.
ESP, я иду к тебе.

/ЗЫ Почему здесь (в этой теме)?
Всё просто, мои аквасы постоянно мне рассказывают о своем состоянии (охлаждают или нагревают воду). Ну и просто я люблю такой контроль над устройствами.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
16 часов назад, VALKNUT сказал(а):

ESP, я иду к тебе.

Есть пробитие ворот! :ap:

image.jpg.be4fec2fc5c64149860e66f52fd18137.jpg

 

  • Лайк 1
  • Спасибо! 1

Поделиться сообщением


Ссылка на сообщение
Lx671    440

Очень актуальной вещью оказалось создание обычных кнопок для изменения яркости света, вкл/выкл каких-то устройств... 

Там, где есть аналоговый вход (esp8266-да, esp32-нет) - можно создать десятки кнопок. 

Там где обведено желтым - это "10 кнопок", сделаны с экономией места)) 2 кнопки переключаются (П1) 5 разных положений = 10.

Ну и получился несложный модуль управления для диммируемых (с регулировкой яркости) обычных ламп 220В. Управляется от обычного ШИМ с контроллера.

Качество работы у них, как через алису, только уровней яркости на много больше. И отлично регулируются лампы накаливания 220в до 25 вт.

На небольшом радиаторе получилось 25 ВТ. Мне эта функция не нужна, но ради интереса собрал)).

Если кто собрать захочет, схему нарисую...

DSC_0001.JPG

DSC_0002.JPG

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

До чего дошел прогресс... вкалывают роботы, а не человек (с) Приключения Электроника..
Ури! Ури! Где у него кнопка? :ap:

Представляю вашему вниманию прекрасный инструмент для отупения человечества! Алиска!
robo003.thumb.png.8acf8f181b06a1eb7b2f8c57da49d114.png

Два дня мы с ней игрались в заказчика и программиста и в итоге получился отличный инструмент для мониторинга и управления климатом аквасов.
Вариант 1.
- Один контроллер ESP32C3 Super Mini - 150р на ОЗОНе.
- Два цифровых датчика DS18B20, подключенных параллельно
- Вывод температуры JSON формате, для обработки в HASS (Home Assistant), на базе HAOS (Home Assistant Operation Sytem).
- Возможность "обновления по воздуху" http://адрес_устройства/ota
Код для ESPшки - проверено, отточено!

/*
 * Проект: Система мониторинга температуры с OTA‑обновлением
 * Устройство: ESP32C3 Super Mini + DS18B20
 * Автор решения: Виртуальный AI‑помощник Алиса (семейство моделей Alice AI, Яндекс)
 * Дата создания: 2024
 * Лицензия: CC BY‑SA 4.0 (разрешено использование с указанием авторства)
 *
 * Техническое задание:
 * 1. Автономная работа без подключения к компьютеру после запуска.
 * 2. Мониторинг температуры через датчик DS18B20.
 * 3. Веб‑интерфейс для OTA‑обновления прошивки.
 * 4. Минимальное потребление памяти и энергопотребления.
 * 5. Отсутствие Serial‑вывода для экономии ресурсов.
 * 6. Поддержка mDNS для удобного доступа.
 * 7. JSON‑ответ для интеграции с Home Assistant.
 * 8. Принудительная перезагрузка после успешного OTA.
 */

#include <WiFi.h>
#include <WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESPmDNS.h>
#include <Update.h>

// Настройки Wi‑Fi
const char* ssid = "ВАШАСЕТЬ";
const char* password = "ВАШПАРОЛЬ";

// Имя для OTA и mDNS
const char* hostName = "aquas-sensor-1";

// Пин для датчика DS18B20
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Веб‑сервер
WebServer server(80);

// HTML‑страница для OTA (без пароля)
const char* otaPage = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>OTA Update - Aquas Sensor</title>
  <style>
    body { font-family: Arial; margin: 40px; }
    .container { max-width: 500px; margin: auto; }
    input, button { padding: 10px; margin: 5px 0; width: 100%; }
    button { background: #4CAF50; color: white; border: none; cursor: pointer; }
    button:hover { background: #45a049; }
  </style>
</head>
<body>
  <div class="container">
    <h2>[VKN] OTA Update</h2>
    <p>Устройство: <strong>%DEVICE_NAME%</strong></p>
    <p>IP: <strong>%IP_ADDRESS%</strong></p>

    <form method="POST" action="/update" enctype="multipart/form-data">
      <input type="file" name="update" required>
      <button type="submit">Загрузить и обновить</button>
    </form>

    <div id="status"></div>
  </div>
</body>
</html>
)rawliteral";

void handleRoot() {
  sensors.setResolution(12);
  sensors.requestTemperatures();

  // Считываем температуру с первого датчика (индекс 0)
  float temp1 = sensors.getTempCByIndex(0);
  // Считываем температуру со второго датчика (индекс 1)
  float temp2 = sensors.getTempCByIndex(1);

  String json = "{";

  // Обрабатываем первый датчик
  if (temp1 == DEVICE_DISCONNECTED_C) {
    json += "\"temperature1\":null";
  } else {
    json += "\"temperature1\":" + String(temp1, 2);
  }

  json += ","; // Разделитель между полями JSON

  // Обрабатываем второй датчик
  if (temp2 == DEVICE_DISCONNECTED_C) {
    json += "\"temperature2\":null";
  } else {
    json += "\"temperature2\":" + String(temp2, 2);
  }

  json += "}";
  server.send(200, "application/json", json);
}

void handleOTA() {
  String page = String(otaPage);
  page.replace("%DEVICE_NAME%", hostName);
  page.replace("%IP_ADDRESS%", WiFi.localIP().toString());
  server.send(200, "text/html", page);
}

void handleUpdate() {
  HTTPUpload& upload = server.upload();

  if (upload.status == UPLOAD_FILE_START) {
    uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
    if (!Update.begin(maxSketchSpace)) {
      server.send(500, "text/plain", "OTA Update Failed: Not enough memory");
    }
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
      Update.end();
      server.send(500, "text/plain", "OTA Update Failed: Write error");
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    if (Update.end(true)) {
      delay(1000);
      ESP.restart();
    } else {
      server.send(500, "text/plain", "OTA Update Failed: Finalization error");
    }
  }
}

void setup() {
  Serial.begin(115200); // Для отладки
  sensors.begin();

  // Вывод информации о датчиках в монитор порта
  Serial.print("Найдено датчиков DS18B20: ");
  Serial.println(sensors.getDeviceCount());

  // Подключение к Wi‑Fi с таймаутом 30 секунд
  WiFi.begin(ssid, password);
  unsigned long startTime = millis();
  while (WiFi.status() != WL_CONNECTED && (millis() - startTime) < 30000) {
    delay(500);
  }

  // Настройка mDNS
  MDNS.begin(hostName);

  // Настройка маршрутов веб‑сервера
  server.on("/", handleRoot);
  server.on("/ota", handleOTA);
  server.on("/update", HTTP_POST, [] () {
    if (Update.hasError()) {
      server.send(500, "text/plain", "OTA Update Failed");
    } else {
      server.send(200, "text/plain", "OK");
    }
  }, handleUpdate);

  server.begin();
}

void loop() {
  server.handleClient();
}

Вариант 2.
- Один контроллер ESP32C3 Super Mini
- Один датчик DS18B20
- Вывод температуры JSON формате
- Возможность "обновления по воздуху" http://адрес_устройства/ota
Код для ESPшки - проверено, отточено!

/*
 * Проект: Система мониторинга температуры с OTA‑обновлением (версия 2)
 * Устройство: ESP32C3 Super Mini + DS18B20
 * Автор решения: Виртуальный AI‑помощник Алиса (семейство моделей Alice AI, Яндекс)
 * Дата создания: 2024
 * Лицензия: CC BY‑SA 4.0 (разрешено использование с указанием авторства)
 *
 * Техническое задание (расширенное):
 * 1. Автономная работа без подключения к компьютеру после запуска.
 * 2. Мониторинг температуры через датчик DS18B20 с разрешением 12 бит.
 * 3. Веб‑интерфейс для OTA‑обновления прошивки с улучшенным логированием (в HTTP‑ответе).
 * 4. Минимальное потребление памяти и энергопотребления.
 * 5. Отсутствие Serial‑вывода для экономии ресурсов (кроме критических ошибок в HTTP).
 * 6. Поддержка mDNS для удобного доступа по имени.
 * 7. JSON‑ответ для интеграции с Home Assistant и другими системами.
 * 8. Принудительная перезагрузка после успешного OTA с задержкой для стабилизации.
 * 9. Проверка доступной памяти перед началом OTA.
 * 10. Обработка ошибок на всех этапах OTA с возвратом HTTP‑статусов.
 */

#include <WiFi.h>
#include <WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESPmDNS.h>
#include <Update.h>

// Настройки Wi‑Fi
const char* ssid = "ВАШВАЙФАЙ";
const char* password = "ВАШПАРОЛЬ";

// Имя для OTA и mDNS
const char* hostName = "aquas-sensor-3";

// Пин для датчика DS18B20
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Веб‑сервер
WebServer server(80);

// HTML‑страница для OTA (без пароля)
const char* otaPage = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>OTA Update - Aquas Sensor</title>
  <style>
    body { font-family: Arial; margin: 40px; }
    .container { max-width: 500px; margin: auto; }
    input, button { padding: 10px; margin: 5px 0; width: 100%; }
    button { background: #4CAF50; color: white; border: none; cursor: pointer; }
    button:hover { background: #45a049; }
  </style>
</head>
<body>
  <div class="container">
    <h2>OTA Update v2</h2>
    <p>Устройство: <strong>%DEVICE_NAME%</strong></p>
    <p>IP: <strong>%IP_ADDRESS%</strong></p>

    <form method="POST" action="/update" enctype="multipart/form-data">
      <input type="file" name="update" required>
      <button type="submit">Загрузить и обновить</button>
    </form>

    <div id="status"></div>
  </div>
</body>
</html>
)rawliteral";

void handleRoot() {
  sensors.setResolution(12);
  sensors.requestTemperatures();

  // Чтение температуры
  float tempC = sensors.getTempCByIndex(0);

  if (tempC == DEVICE_DISCONNECTED_C) {
    String json = "{\"temperature\":null}";
    server.send(200, "application/json", json);
  } else {
    String json = "{\"temperature\":" + String(tempC, 2) + "}";
    server.send(200, "application/json", json);
  }
}

void handleOTA() {
  String page = String(otaPage);
  page.replace("%DEVICE_NAME%", hostName);
  page.replace("%IP_ADDRESS%", WiFi.localIP().toString());
  server.send(200, "text/html", page);
}

void handleUpdate() {
  HTTPUpload& upload = server.upload();

  if (upload.status == UPLOAD_FILE_START) {
    uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
    if (!Update.begin(maxSketchSpace)) {
      server.send(500, "text/plain", "OTA Update Failed: Not enough memory");
    }
  } else if (upload.status == UPLOAD_FILE_WRITE) {
    if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
      Update.end();
      server.send(500, "text/plain", "OTA Update Failed: Write error");
    }
  } else if (upload.status == UPLOAD_FILE_END) {
    if (Update.end(true)) {
      delay(1000);
      ESP.restart();
    } else {
      server.send(500, "text/plain", "OTA Update Failed: Finalization error");
    }
  }
}

void setup() {
  // Инициализация датчика
  sensors.begin();

  // Подключение к Wi‑Fi с таймаутом 30 секунд
  WiFi.begin(ssid, password);
  unsigned long startTime = millis();
  while (WiFi.status() != WL_CONNECTED && (millis() - startTime) < 30000) {
    delay(500);
  }

  // Настройка mDNS
  MDNS.begin(hostName);

  // Настройка маршрутов веб‑сервера
  server.on("/", handleRoot);
  server.on("/ota", handleOTA);
  server.on("/update", HTTP_POST, [] () {
    if (Update.hasError()) {
      server.send(500, "text/plain", "OTA Update Failed");
    } else {
      server.send(200, "text/plain", "OK");
    }
  }, handleUpdate);

  server.begin();
}

void loop() {
  server.handleClient();
}

Теперь про интеграцию с HASS

Надо в файл /homeassistant/configuration.yaml
Добавить код:

sensor: !include sensors_aquas.yaml

Создать файл /homeassistant/sensors_aquas.yaml
Добавить в него код:
 

  - platform: rest
    resource: "http://192.168.0.175"
    method: GET
    name: "Аквас 1"
    unique_id: "aquas_sensor1_rest_001"
    value_template: "{{ value_json.temperature1 }}"
    unit_of_measurement: "°C"
    device_class: temperature
    scan_interval: 60

  - platform: rest
    resource: "http://192.168.0.175"
    method: GET
    name: "Аквас 2"
    unique_id: "aquas_sensor2_rest_001"
    value_template: "{{ value_json.temperature2 }}"
    unit_of_measurement: "°C"
    device_class: temperature
    scan_interval: 60
    
  - platform: rest
    resource: "http://192.168.0.174"
    method: GET
    name: "Аквас 3"
    unique_id: "aquas_sensor3_rest_001"
    value_template: "{{ value_json.temperature }}"
    unit_of_measurement: "°C"
    device_class: temperature
    scan_interval: 60

Ваши названия и IP могут отличаться, это нормально!

robo002.thumb.png.84413bc99e4e588d1a2fabfcf9f0b7dd.png

С математикой разобрались, теперь физика..
Припаять 1 резистор 4,7кОм и 3 провода от датчика, не такая уж засада.. это не SMD монтаж на паяльной станции..
image.thumb.png.bd22c029ff5e84361b7ce5da02c9b624.png

Я к тому, что если дома есть паяльник и компьютер, то это вопрос 30-300 минут :ap:

Поделиться сообщением


Ссылка на сообщение
soroka    8257

@VALKNUT надо же, даже не заблочил ))

  • Хи-хи-хи 1

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
20 минут назад, soroka сказал(а):

@VALKNUT надо же, даже не заблочил ))

Много букав? :ap:

Есть в русских селениях, дочери незабвенного героя, лейтенанта Шмидта! :ap:
Я про нашу подругу Анастасию... которая с паяльником как с пипидастром..
Это больше для нее было. Она поймет - 100%! Мамай клянус, э! =)

  • Хи-хи-хи 2

Поделиться сообщением


Ссылка на сообщение
Lx671    440

@VALKNUT С некоторый пор  под WIN7 пошло такое уведомление. Под WIN 10 оно тоже есть и еще пара файлов.

Оно все работает, но пишет...  У вас, что-то похожее есть?

Еще выяснилось, что пошло много подделок. Вот 2 платы правее нерабочие. C340 неисправна. Менял такие.

Еще, если не трудно, гляньте в библиотеках, есть ли у вас такой файл - ArduinoJson.h ?

vk_er.jpg

DSC_0001a.jpg

Поделиться сообщением


Ссылка на сообщение

VALKNUT    5072
1 минуту назад, Lx671 сказал(а):

есть ли у вас такой файл - ArduinoJson.h ?

Да, есть, используется регулярно..
Но у Вас ошибка в другом.. Вероятно КРН и сюда запустил свои скользкие ручки. У вас не скачивается индексный файл библиотек..
То есть, Ардуино ИДЕ пытается получить инфу об обновлении библиотек, но не получает доступ. Возникает ошибка.
У меня точно так же..
 

Цитата

Ошибка скачивания индекса 'https://downloads.arduino.cc/libraries/library_index.tar.bz2': Download failed: server returned 403 Forbidden Download failed: server returned 403 Forbidden: https://downloads.arduino.cc/libraries/library_index.tar.bz2

Цитата

Ошибка при проверке обновлений IDE Arduino. 403 "method: GET url: https://downloads.arduino.cc/arduino-ide/stable.yml

 

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Lx671    440
31 минут назад, VALKNUT сказал(а):

Вероятно КРН и сюда запустил свои скользкие ручки

Фигово. С VK не получится esp склеить.  Можете от сюда попробовать - https://github.com/DGO-VA/DGO_VKbot?ysclid=mpo91h5h5296887516

Просто компильнуть без записи в ESP.  

Датчик влажности и наличия воды сделал через обычный цифровой вход (не A0), а сообщение не пошлешь)) Через почту еще поищу...

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
23 минут назад, Lx671 сказал(а):

Фигово. С VK не получится esp склеить.  Можете от сюда попробовать - https://github.com/DGO-VA/DGO_VKbot?ysclid=mpo91h5h5296887516

Просто компильнуть без записи в ESP.  

Датчик влажности и наличия воды сделал через обычный цифровой вход (не A0), а сообщение не пошлешь)) Через почту еще поищу...

Библиотека недоступна по поиску, а репозиторий для Платформио
image.jpg.fa9b972107043202aa4c14adb6b0d94b.jpg

Поделиться сообщением


Ссылка на сообщение
Lx671    440

@VALKNUT Это понятно.  Прежде чем писать, я это сделал. Там  ArduinoJson.h  нет. Это своя библиотека...

ArduinoJson.h запрашивается из DGO_VKbot.h 

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
35 минут назад, Lx671 сказал(а):

@VALKNUT Это понятно.  Прежде чем писать, я это сделал. Там  ArduinoJson.h  нет. Это своя библиотека...

ArduinoJson.h запрашивается из DGO_VKbot.h 

Вот библиотека

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Lx671    440
43 минут назад, VALKNUT сказал(а):

Вот библиотека

Спасибо. С другого места уже установил))  7.2.2.  Странно, что не в любой библиотеке видна, в общем для VK пример начал компилиться...

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

Через НВП качнул крайнюю версию Arduino IDE. Вдруг кому понадобится..

И да, нас (Россию) блокируют по диапазону IP. Гондурасы!

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072

"Каждый охотник желает знать, где сидит фазан"...
Ну, в общем, встал вопрос контроля уровня водички в аквасике.
Вариант 1. Ёмкостный датчик - тупо, сурово, практично. Одно НО! Датчики не герметичны, а те, что через стекло, на 8мм стеке уже тупят и могут подвести в самый неподходящий момент. Но измерения точные и если руки приложить произвести герметизацию, то вполне себе. Но еще одно НО. Датчик бинарный, он покажет только 2 состояния: уровень есть / уровня нет. Для простых ситуаций годное решение и простая реализация.
Вариант 2. Парктроник (ультрасоник), показывает уже расстояние до ватерлинии и вроде бы все отлично, но как правило, минимальная дистанция измерения 20см. Если недолив 5см, то датчик надо поднимать над ватерлинией на 15см - не всегда осуществимо.
Вариант 3. Лазерный дальномер на датчике ВЛ53ЛОХ :ap: (VL53LOX). Вот тут оказалось, что датчик за 200р, гораздо точней и гибче "ультрасоников" за 2500р. У этого парня предел измерений практически заточен под аквасы! От 3см до 2м. То есть! Эта фигатулина за 5 копеек показывает дистанцию в мм! А теперь немного фантазии..
- включаю режим "Подмена 30%" и тупо сливаю воду из акваса, пока приблуда не запищит и не сообщит, что уже 28% - будь готов "сушить шланги". Или.. автоматический долив воды, если уровень снизился на 1см. (ну.. или сколько-то там см, которые я сам для себя определил)
Сегодняшний день посвятил изучению точности определения уровня. Фаворитом стал лазерный датчик. Он прям ваще-ваще.
Заказал пару датчиков, когда случится тестирование, предоставлю более полную информацию.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Lx671    440
10 часов назад, VALKNUT сказал(а):

встал вопрос контроля уровня водички в аквасике

Простейший убогий датчик))) При определенных настройках может замерять влажность поверхности (кожи рук, дерева, земли например) , наличие воды, уровень воды, жесткость воды (ppm).

Работает на 1-м (можно на 2-х) цифровом (D0...D8) входе ESPxx . Плагинов не надо. Так-же имеет аварийные состояния - "короткое замыкание" и "обрыв".

wat_sins.JPG

Поделиться сообщением


Ссылка на сообщение
VALKNUT    5072
6 минут назад, Lx671 сказал(а):

Простейший убогий датчик)))

Не наш метод =)))

Поделиться сообщением


Ссылка на сообщение

AnaAna    7275
В 15.06.2026 - 07:59, VALKNUT сказал(а):

Через НВП качнул крайнюю версию Arduino IDE.

Очень кстати, благодарствую)

Поделиться сообщением


Ссылка на сообщение
Lx671    440

Это уже обкатанное устройство  (к антрисоле приделана) следит за протечками. Постоянно датчики опрашивает и при критических изменениях шлет письма)) 

И в реальном времени можно смотреть. И контрольные светодиоды есть...

Шлейфы без экрана 3-4м работают нормально. Помехи небольшие - отсекаются программно.

Сверху подтапливать задолбали, пришлось сделать. 1-ну крупную причину уже нашли. ЖКО работников ищет.

Для наблюдения за аквариумами тоже подходит.

DSC_0001.JPG

DSC_0002.jpg

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×