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

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

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

VALKNUT    4842

Собратья и сосёстры, дратути!
Хочу поделиться прошивкой для 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    4842

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

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

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

image.jpg.a27428463cbc653479cc1df8fe93f7f4.jpg

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

  • Лайк 2

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


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

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

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

  • Лайк 2

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


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

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

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

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

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


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

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

 

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

  • Хи-хи-хи 2

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

  • Хи-хи-хи 2

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


Ссылка на сообщение
Lx671    420
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    4842
1 час назад, Lx671 сказал(а):

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

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

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

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


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

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

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

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

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

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

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

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


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

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

  • Хи-хи-хи 2

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


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

Немного допилил код для 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    4842

Время социальных ограничений привело меня к заботе: как получать уведомления от серверов, роутеров И! Аквариумов (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    4842
16 часов назад, VALKNUT сказал(а):

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

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

image.jpg.be4fec2fc5c64149860e66f52fd18137.jpg

 

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

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


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

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

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

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

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

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

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

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

DSC_0001.JPG

DSC_0002.JPG

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


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

До чего дошел прогресс... вкалывают роботы, а не человек (с) Приключения Электроника..
Ури! Ури! Где у него кнопка? :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 BYSA 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>

// Настройки WiFi
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());

  // Подключение к WiFi с таймаутом 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 BYSA 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>

// Настройки WiFi
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();

  // Подключение к WiFi с таймаутом 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:

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


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

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

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

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

  • Хи-хи-хи 2

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


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

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

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

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

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

vk_er.jpg

DSC_0001a.jpg

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


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

VALKNUT    4842
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    420
31 минут назад, VALKNUT сказал(а):

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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

  • Лайк 1

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


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

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

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

  • Лайк 1

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


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

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

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

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


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

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

  • Лайк 1

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


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

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

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

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

wat_sins.JPG

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти

×