Собираем СМС-весы пчеловода на Arduino без пайки* + как это работает

Scale

Пчеловоды – весьма трудолюбивый и неунывающий народ, который нередко сам делает инвентарь для пасеки!

Но многих смущает обилие пайки в моей конструкции.

Поэтому я решил сделать максимально простой проект в духе Массимо Банци (одного из создателей Arduino).

Кроме того, Вы не поверите, но за годы работы с этой платформой, у меня никогда не было беспаечной макетной платы:

400

Она так и зовется, макетная плата-400

Но я-бы рекомендовал еще взять плату PCB 5х7см, если решите вдруг увековечить конструкцию при помощи паяльника 😉

Естественно, дело не обойдется без Arduino Pro Mini 3.3V 8Mhz:

Arduino

,модуля связи SIM800l с антенкой:

SIM800l

и модуля АЦП HX-711:

HX711

На последних трех компонентах попросите сразу распаять контактные гребенки (в радиомагазинах за скромную плату обычно это делают):

Комплект

В результате, мы получим таких вот букашечек-таракашечек 😉

Единственное, что придется паять самостоятельно – это сигнальные провода (E+ E- A+ A-) на плате АЦП.

Кроме того нам понадобится:

USB-UART конветер CH340, диод 1N4007, электролитический конденсатор 2200 мкФ 16V, фоторезистор GL5528 и модуль зарядки TP4056(если мы будем использовать LiIon батарею).

Еще нужны будут по десятку гибких проводников для макетирования (dupont) папа-папа, мама-мама, папа-мама (всего 30).
В принципе, их надо меньше, но если брать поштучно, по 7-8, они будут стоить те-же деньги.

Это все обойдется ну максимум долларов в 15, но самую вишенку я оставил напоследок 😉

Нам понадобятся неработающие напольные электронные весы, которые кто выбрасывает, а кто просто отдает за бутылку пива.

Тут мы вообще убиваем сразу двух зайцев – экономим 5$ на тензодатчиках(которые обычно не ломаются), и получаем красивую основу для них-же :

Даром!

А если вспомнить, что тем самым мы избавляем свалку от пополнения еще одним компонентом, то вообще можно приписать себя к движению “зеленых” 😉

Не удалось раздобыть весы бесплатно? Не беда! Такие наверняка есть у Вашей жены/девушки/любовницы!

Убедите ее что она самая прекрасная даже без процедур взвешивания, и дело в шляпе!

А заодно утащите с кухни одну из прозрачных коробочек для продуктов, но лучше все-таки попросить 😉

Темы питания я сейчас не касаюсь, ибо пока мы будем брать его от компьютера.

В дальнейшем-же можно будет приспособить старую батарею и зарядку от мобильника (спасем окружающую среду еще раз).

Правда заряжать придется раз в неделю.

Ах да, без сим-каты мобильного оператора нам тоже не обойтись.

Итак, все компоненты в наличии – вперед!

Сейчас приступим к любимому “очумелыми ручками” процессу – потрошить технику (весы).

Кроме увлекательности, данный этап является также самым ответственным и вот почему (далее мы разберем принцип работы электронных весов):

Мост Уитстона

На картинке изображен измерительный мост Уитстона, R2 – тензорезистор (меняет сопротивление в зависимости от нагрузки)

В идеале, без веса, вольтметр Vg показывает 0, соответственно, с увеличением оного, мы будем регистрировать изменение напряжения.

Оно также зависит от напряжения батареи подключеной к мосту.

Дальше – дело техники – вместо вольтметра ставится аналого-цифровой преобразователь (АЦП), дисплей, и в итоге на экранчике мы видем килограммы/фунты и т.д.

Если заглянуть в характеристики Arduino, то мы найдем, что на борту уже имеется 10-битный АЦП, так почему-же не использовать его?

Обычно, в напольных весах используется такой вот тензодатчик (нагрузка до 50кг, всего х4):

Тензодатчик

Он содержит половинку моста Уитстона (с R2).

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

Из ардуино не выжать чувствительность лучше 1мВ, то-есть мы сможем регистрировать минимальное изменения веса в 5 килограмм.

Вот почему необходим внешний усилитель, либо АЦП – HX711(24бит) в нашем случае, что теоретически расширяет чувствительность до грамм.

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

Отсюда и вытекает необходимость пайки моста к плате АЦП и дальнейшая изоляция контактов от влаги

Но хватит сухой теории, пора вскрывать весы:

До переделки

Тут стоит заметить, что хитрые китайцы (а может не китайцы а может и не хитрые, но тоже молодцы 😉 придумали, как соединить 4 полумоста в 1 мост, сэкономив на АЦП:

Соединение датчиков

Для того, чтобы разобраться, где какой вывод (на фотографии овал №3), Вам понадобится тестер, DT-830 вполне подойдет, ну или дедовский стрелочный, главное чтобы мог измерять сопротивление 1-3кОм.

Ищем пары выводов с сопротивлением 2К (если 1.5К – не оно)

Если тестера нет, можно еще подразобрать весы и проследить все по проводам!

Мне повезло, и соединения были выполнены в соответствии с приведеной схемой.

Только вот порядок подключения проводов к АЦП другой (следите за очередностью подключения красных!):

Порядок подключения

Будьте внимательны, иначе весы будут показывать отрицательный вес(тогда достаточно поменять местами провода A+ и А-), либо вообще не показывать ничего (проверить схему еще раз).

Соединения 1 и 2 нужно сохранить, остальное (плату и экран)- удалить:

После переделки

Можно сразу подключить провода мама-мама (на фото в желтом овале), покрывать контакты и плату АЦП лаком будем когда все заработает.

Теперь откладываем нашу измерительную часть и собираем схеу на макетной плате:

Начало сборки

Обратите внимание, справа – шина питания 5V (подаем из компьютера), слева – 4V

Они получаются за счет падения напряжения на диоде (обведен синим овалом) – устанавливается серебристым ободком влево!

Не перепутайте полярность электролитического конденсатора (минус обозначен белой полосой на корпусе).

Фоторезистор (в желтом кружочке) полярности не имеет – ему все-равно.

Да, и не забудьте вставить сим карту (предварительно нужно пополнить и отключить запрос пин-кода).

На фото я ее специально не дослал в держатель модуля SIM800L – сверху, контактами к себе, скосом в сторону буквы f макетной платы.

А теперь берем наши соединительные провода, и вперед “втыкать” я для удобства разложил провода в форме клевера:

Соединения

Для начала соединяем питание: красный и коричневый провода с USB-TTL (“свисток” справа от макетной платы) на левую шину питания.

Далее соединяем землю левой и правой шин (черный провод снизу).

С правой шины подаем питание на arduino – коричневый и красный (gnd и raw), SIM800l.

Далее, подключаем провода передачи данных (желтый и оранжевый) между arduino и USB-TTL, arduino и SIM800l

Да, у Вас не будет столько проводов одинакового цвета, но у меня есть, поэтому для понятности и соблюдения цветовой дифференциации штанов сделал так.

Просто соединяйте в соответствии с фотографией.

Ок, осталось подключить синий провод выключения модуля GSM и шлейф от наших весов (слева).

Хочу акцентировать внимание – питание на HX711 берется со внутреннего стабилизатора Ардуино – сиреневый провод на VCC!

Вроде ничего сложного, но как по мне, на обычной макетной плате все было-бы несколько попроще (вид со стороны установки модулей):

Соединения2

А всего-то 16 точек пайки!

Теперь, если включить USB-TTL в порт компьютера(лучше через USB-удлинитель), и Ваш ардуино новый в целофане, то он заморгает светодиодом с частотой раз в секунду.

Модуль связи тоже начнет подмигивать, сигнализируя что у него все в порядке.

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

Буду описывать последовательность действий для Windows:

Во-первых, необходимо скачать и установить/распаковать программу Arduino IDE – текущая версия – 1.8.9, но я пользуюсь 1.6.4

Для простоты распаковываем архив в папку C:\arduino-“номер Вашей версии”, внутри у нас будут папки /dist, drivers, examples, hardware, java, lib, libraries, reference, tools, а также исполняемый файл arduino (помимо прочих).

Теперь нам потребуется библиотека для работы с АЦП.

Содержимое (папка HX711-master) ложится в каталог C:\arduino-“номер Вашей версии”\libraries

Ну и конечно-же драйвер для USB-TTL с того-же github – из распакованного архива просто запускается инсталяха файлом SETUP.

Запускаем и настраиваем программу C:\arduino-“номер Вашей версии”\arduino

Интерфейс программы

Заходим в пункт “Инструменты”-выбираем плату “Arduino Pro or Pro Mini” , процессор Atmega 328 3.3V 8 MHz , порт – номер кроме системного COM1 (он появляется после установки драйвера CH340 при подключенном USB-TTL адаптере).

Ок, копируем нижеследующий скетч (программу), и вставляем ее в окно Arduino IDE

//char phone_no[]="+123456789012"; // Номер телефона +код страны, на который будут приходить SMS


byte pin2sleep=9; //  Пин включения/выключения GSM-модуля

#include <avr/sleep.h>  // Библиотека перевода ARDUINO в режим сна

#include <SoftwareSerial.h> // Библиотека программного последовательного порта
#include "HX711.h" // Библиотека HX711 https://github.com/bogde/HX711 или beefree.xyz/wp-content/uploads/2019/07/HX711-master.zip
HX711 scale;
#include <EEPROM.h> // Библиотека баботы с EEPROM (постоянной перезаписываемой памятью)

SoftwareSerial mySerial(10, 11); // Назначаем порты вввода/вывода для GSM-модуля


float delta00; // Изменение веса с момента старта

float delta01; // Изменение веса с предыдущего срабатывания


float raw00; //"сырые" данные с АЦП на момент старта

float raw01; //"сырые" данные с АЦП от предыдущего срабатывания

float raw02; //текущие данные с АЦП

word calibrate0=20880; //калибровочный коэфициент для датчиков (возможно необходима корректировка под Вашу модель)

word daynum=0; //количество дней(срабатываний) от старта

word i;

boolean setZero=false;

// Далее - текстовые переменные для обработчика информации от модуля связи

char ch = 0;
char ch1 = 0;
char ch2 = 0;
char ch3 = 0;
char ch4 = 0;

char csq = 0;
char csq1 = 0;
char csq2 = 0;
char csq3 = 0;
char csq4 = 0;

void readVcc() // Функция чтения заряда батареи из GSM-модуля
{
  ch = mySerial.read();
   while (mySerial.available() > 0) {  ch = mySerial.read(); } // очищаем входной буфер порта

 mySerial.println("AT+CBC"); //запрашивем статус батареи у GSM-модуля
// delay(200);
for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
 while (mySerial.available() > 0) { // считываем входную строку после запятой
 ch = mySerial.read();
     if (ch ==','){ 
       ch1 = mySerial.read();
       ch2 = mySerial.read();
       ch3 = mySerial.read();
       ch4 = mySerial.read();       
     }
   }
}

void SignalQ() // Считывание мощности сигнала GSM
{
  csq = mySerial.read();
   while (mySerial.available() > 0) {  csq = mySerial.read(); } // очищаем входной буфер порта

 mySerial.println("AT+CSQ"); //запрашиваем у GSM-модуля мощность сигнала
// delay(200);
for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
 while (mySerial.available() > 0) { //считываем входную строку после двоеточия
 csq = mySerial.read();
     if (csq ==':'){ 
       csq1 = mySerial.read();
       csq2 = mySerial.read();
       csq3 = mySerial.read();
       csq4 = mySerial.read();       
     }
   }
}


void SendStat() //функция чтения и отправки веса в виде СМС
{

  detachInterrupt(digitalPinToInterrupt(0)); // запрет прерываний
  delayMicroseconds(10000); // в режиме прерывания функция delay не работает  - используем delayMicroseconds

  scale.power_up(); //Включение модуля HX711

    digitalWrite(13, HIGH);  

digitalWrite(pin2sleep, LOW); // Включаем GSM-модуль
for ( i = 0; i <= 2100 ; i++) { delayMicroseconds(10000);}

  raw01=raw02;

  raw02=scale.get_units(240); // "прогрев" модуля HX711 и тензорезисторов
  raw02=scale.get_units(20); // берем усредненные данные по 20 считываниям

  daynum++; 
  delta00=(raw02-raw00)/calibrate0; // вычисление изменения веса
  delta01=(raw02-raw01)/calibrate0;


  readVcc(); 
  SignalQ();

//  delay(200);
  for ( i = 0; i <= 20 ; i++) { delayMicroseconds(10000);}
  mySerial.println("AT+CMGF=1");    //  Начало блока отправки СМС
  //delay(2000);
    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}
  mySerial.print("AT+CMGS=\"");
  mySerial.print(phone_no); 
  mySerial.write(0x22);
  mySerial.write(0x0D);  // шеснадцатеричный эквивалент возврата каретки
  mySerial.write(0x0A);  // шеснадцатеричный эквивалент новой строки
//  delay(2000);
    for ( i = 0; i <= 200 ; i++) { delayMicroseconds(10000);}
  mySerial.print("Turn ");
  mySerial.println(daynum);
  mySerial.print("Hive weight  ");
  mySerial.print(delta01);
  mySerial.print("   ");
  mySerial.println(delta00);
  mySerial.print("Battery capacity is ");
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);}
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);}
  mySerial.println(" %");
  mySerial.print("GSM signal strenght:  ");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);}
  mySerial.println(" of 31");
  mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  for ( i = 0; i <= 700 ; i++) { delayMicroseconds(10000);}


digitalWrite(pin2sleep, HIGH); // Выключение GSM-модуля

scale.power_down(); //Выключение весов

attachInterrupt(0, SendStat , RISING); // Включаем прерывание (запуск функции SendStat) по затемнению фоторезистора (закат)

  digitalWrite(13, LOW);

}
// *************************************************************************************************

void switchto9600() //переключение скорости порта GSM-модуля на 9600, активация режима "сна"
{
mySerial.begin(115200); // Открытие програмного последовательного порта
delay(16000); // wait for boot
mySerial.println("AT");
delay(200);
mySerial.println("AT");
delay(200);
mySerial.println("AT+IPR=9600");    //  Команда смены скорости
delay(200);
mySerial.begin(9600);
mySerial.println("AT&W0"); // запись изменений
delay(200);
mySerial.println("AT&W");
delay(200);
mySerial.println("AT+CSCLK=1"); // активация режима "сна" - засыпает по высокому уровню на DTR (pin2sleep), включение - по низкому
}

void setup() { // Процедура инициализации - выполняется однократно при старте

  // Инициализация модуля АЦП
  // HX711.DOUT - pin 7
  // HX711.PD_SCK   - pin 8
  scale.begin(7, 8);
  scale.set_scale();


  pinMode(13, OUTPUT);  // Режим работы пина светодиода (13)
  pinMode(pin2sleep, OUTPUT);// Init ON/OFF pin for GSM Инициализация пина включения/выключения модема
  pinMode(2, INPUT_PULLUP); // Включение внутреннего напряжения подтяжки на пин 2 (для фотодатчика)
  Serial.begin(9600);

digitalWrite(pin2sleep, LOW); // Включение GSM-vjlekz
  delay(21000); // Ожидание запуска


// -------------------------------------------------------------------------------

switchto9600(); //Переключение скорости порта GSM-модуля

// -------------------------------------------------------------------------------

mySerial.begin(9600);

delay(200);

setZero=digitalRead(2); //проверка необходимости сброса параметров (при затененном фоторезисторе)

//if (EEPROM.read(500)==EEPROM.read(501) || setZero) // сброс параметров при первом включении
if (setZero)
{
  raw00=scale.get_units(240); // "прогрев" модуля HX711 и тензорезисторов
  raw00=scale.get_units(20); // берем усредненные данные по 20 считываниям

EEPROM.put(500, raw00); //запись данных в ППЗУ

for (int i = 0; i <= 24; i++) { //моргаем светодиодом
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
}
else {
EEPROM.get(500, raw00); // весы просто выключались/меняли батарею - считывание исходных параметров АЦП

digitalWrite(13, HIGH); // Включаем светодиод на 12 секунд
    delay(12000);
digitalWrite(13, LOW);
}

delay(200); // Тестовая СМС при первом включении

readVcc();
SignalQ();
delay(200);
  mySerial.println("AT+CMGF=1");    
  delay(2000);
  mySerial.print("AT+CMGS=\"");
  mySerial.print(phone_no); 
  mySerial.write(0x22);
  mySerial.write(0x0D);  // шеснадцатеричный эквивалент возврата каретки
  mySerial.write(0x0A);  // шеснадцатеричный эквивалент новой строки
  delay(2000);
  mySerial.println("INITIAL BOOT OK");

  mySerial.print("Battery capacity is ");
  mySerial.print(ch1);
  mySerial.print(ch2);
  if (ch3 != ',') {mySerial.print(ch3);}
  if (ch4 != ',' && ch3 != ',') {mySerial.print(ch4);}
  mySerial.println(" %");
  mySerial.print("GSM signal strenght:  ");
  mySerial.print(csq1);
  mySerial.print(csq2);
  mySerial.print(csq3);
  if (csq4 != ',') {mySerial.print(csq4);}
  mySerial.println(" of 31");
  mySerial.println (char(26));// код ASCII комбинации ctrl+z 
  delay(7000);

raw02=raw00;

digitalWrite(pin2sleep, HIGH); // Выключение GSM-модуля


  scale.power_down(); //Выключение модуля HX711

attachInterrupt(0, SendStat , RISING); // Включаем прерывание (запуск функции SendStat) по затемнению фоторезистора (закат)

}

void loop() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Выбираем режим сна Ардуино
  sleep_mode(); // ВСЕМ СПАТЬ! 
  delay(3000);

}


В первой строке, в кавычках char phone_no[]=”+123456789012″; – вместо 123456789012 ставим свой номер телефона с кодом страны, на который будут приходить СМС.

Жмем кнопку проверить (над цифрой один в скриншоте выше) – если внизу (под тройкой на скрине) “Компиляция завершена” – то можем прошивать микроконтроллер.

Так, USB-TTL подключен к ARDUINO и компьютеру – приступаем:

Для начала, тренируемся нажимать красную(серебристую) кнопку микроконтроллера – это нужно будет сделать строго в определенный момент!!!

Есть? Жмем кнопку “Вгрузить” (над двоечкой на скриншоте), и внимательно смотрим на строку внизу интерфейса (под тройкой скрина).

Как только надпись “компиляция” сменится “загрузкой” – жмем красную кнопку (ресет) – если все ок – на USB-TTL адаптере радостно заморгают огоньки, а внизу интерфейса надпись “Вгрузили”

Пока мы ждем прихода тестовой СМС на телефон, расскажу как работает программа:

При первом включении система сверяет байты номер 500 и 501 EEPROM если они равны, значит калибровочные данные не записаны, и алгоритм переходит к разделу настройки.

То-же самое происходит, если при включении фоторезистор затенен (колпачком от авторучки/пальцем) – активируется режим сброса параметров.

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

На ардуино при этом начнет моргать встроенный светодиод пина 13.

Если сброс не происходит, светодиод просто загорается на 12 секунд.

После этого отправляется тестовая СМС с сообщением “INITIAL BOOT OK” , качеством приема GSM-сигнала и процентом заряда батареи.

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

При этом снимаются показания тензодатчиков, вычисляется изменение веса с предыдущего срабатывания(первое число в строке после Hive) и от первого включения, проверяется напряжение батареи и эта информация отправляется в виде СМС:

Скриншот работы

Кстати, получили СМС? Поздравляю!

Возможно, мы почти закончили.

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

В идеале, нам придет СМС, с весом, соответствующим литражу.

Но возможны варианты:

  1. Если вес со знаком минус, тогда достаточно поменять местами провода A+ и А-.

  2. Если вес не соответствует действительности, нужно корректировать строку word calibrate0=20880;
    При больших показаниях, увеличиваем число 20880 во столько раз, во сколько измеренный вес больше реального, ну и наоборот.

  3. Если в строке веса пришло nan nan (not a number) – неправильно подключены тензодатчики/обрыв провода.
    Сопротивление одного плеча отключенного от всего отдельного датчика (красный-черный и черный-белый) должно составлять 1килоОм.

Надеюсь у Вас все получилось!

Помните, я обещал спасти планету от загрязнения старыми батареями? Время пришло 😉

Программа написана так ,что система постоянно находится в режиме сна, потребляя при этом около 4 миллиампер (или 2, если выковырять постоянно горящий на Ардуино светодиод зубочисткой)

Вроде и немного, но возьмем к примеру батарею от старой Nokia (BL-5C), емкостью 1020 мАч, допустим, она сильно подустала, до 600.

тогда 600/2 = 300ч/24=12.5 суток.

Откуда можно взять батареи еще?

Старые смартфоны, сломаные планшеты, там они широкие и плоские , но более емкие, и наконец батареи ноутбуков.

Если разобрать “сдохший” элемент компьютера, то там мы найдем минимум три батареи стандарта 18650!

Берем тестер, замеряем напряжение каждой, та что с наименьшим – несем в пункт сбора на утилизацию, остальные – очень еще послужат!

У меня две таких, емкость составляет около 1800мАч.

Откуда я узнал емкость? Все просто – есть куча измерителей в стиле вот такого:

USB-meter

Помимо возможности оценить емкость батареи, данный приборчик помогает мне выявить битые USB-шнуры, зарядки и порты, не “тянущие” по току.

Но мы отклонилились от темы.

Вот теперь, когда уже все работает, пришло время как минимум покрыть плату АЦП лаком/воском/парафином.

Ну и конечно-же, увековечить конструкцию с помощью паяльника, как я писал выше.

Будет-ли работать все на беспаечной макетной плате под открытым небом?

Да на любой плате незакрытая от осадков конструкция просуществует до первого дожя!

Вот почему выше писалось о прозрачном судке для продуктов (ведь нам нужно, чтобы фотоэлемент “видел” небо)!

Но если Вы все-же решились использовать систему не прибегая к пайке, весьма нелишним будет использование аэрозольной смазки XADO/WD40.

Что-же еще можно сделать на базе уже собраной системы?

В интернете есть множество Ардуино-сообществ и форумов, over 100500 примеров работы с разным оборудованием.

А самое главное, все это достаточно просто обьединяется в Ваши проэкты (если конечно не прогуливали информатику в школе 😉

Самое простое в данном случае – подключение экранчика и кнопок для просмотра веса а также датчика влажности/температуры.

Главное, помнить – в мире нет ничего невозможного! Есть только вещи к которым мы недостаточно стремимся!

С уважением, электропчеловод Андрей.

2 thoughts on “Собираем СМС-весы пчеловода на Arduino без пайки* + как это работает”

  1. Какой модуль GSM SIM800l или IOT-GA6-B лучше использовать. По командам они взаимозаменяемые ?

    1. Добрый день!
      Да, команды незначительно отличаются AT+CBC и AT+CBC? для IOT, немного разные строки ответа.
      По работе с СМС они одинаковые.

      Основное отличие – в питании:
      Работающий модуль IOT-GA6-B потребляет 17/35 ма (в зависимости от стандарта связи), SIM800 – вдвое больше.

      В режиме сна оба модуля потребляют около 2мА.
      Активируется он тоже по разному – на SIM800 просто подается высокий уровень сигнала, в IOT приходится “передергивать затвор” с интервалом 2.2с.

      SIM800 расcчитан на питание и сигналы ~3.3В, IOT имеет бортовой step-down c 5В(для уровня 3.3В надо подпаиваться к конденсатору ), демократичен к логическим уровням TTL

      То-есть, скорректировав скетч под специфику каждого – особой разницы не вижу – хоть Neoway M590E

      Но лично мне симпатичны IOT-GA6-B , как более свежая разработка компании AI-THINKER, есть версии с возможностью подключить камеру прямо на модуль связи.

Leave a Reply

Your email address will not be published. Required fields are marked *