Comments 43
Может подключить к arduino mqtt протокол и рассказать здесь об этом?
forum.iobroker.com/viewtopic.php?f=16&t=714&sid=186a2c748ed6196910ab6d580e4bb495&start=60#p5294
Тогда можно будет сделать WebFront какой угодно. Например с такими контролами:


forum.iobroker.com/viewtopic.php?f=16&t=714&sid=186a2c748ed6196910ab6d580e4bb495&start=60#p5294
Тогда можно будет сделать WebFront какой угодно. Например с такими контролами:


Ничего личного, но код просто ужасен.
>>Serial.print()
Раз 20 подряд. Нет ощущения, что можно как-то более изящно написать?
>>switch (descript[3])
Свитч на пару страниц…
>>shim1, flagobnov, glavnaia, sh1, sl1, d5shimvkl
Имена функций и переменных просто жесть (1С-ное прошлое?)
>>analogWrite(5, shim1 * 2.55)
Magic numbers?
Хоть Ардуино и «детская» платформа, но это не значит что допустимо наплевательское отношение к качеству кода.
>>Serial.print()
Раз 20 подряд. Нет ощущения, что можно как-то более изящно написать?
>>switch (descript[3])
Свитч на пару страниц…
>>shim1, flagobnov, glavnaia, sh1, sl1, d5shimvkl
Имена функций и переменных просто жесть (1С-ное прошлое?)
>>analogWrite(5, shim1 * 2.55)
Magic numbers?
Хоть Ардуино и «детская» платформа, но это не значит что допустимо наплевательское отношение к качеству кода.
(>>Serial.print()
Раз 20 подряд. Нет ощущения, что можно как-то более изящно написать?
>>switch (descript[3])
Свитч на пару страниц…)
Вы правы, можно всё записать короче, но я преследовал максимальную читабельность и удобство изятия/вставки блоков.
Для «новичков», на мой взгляд, так будет понятнее (в дальнейшем они сами научатся писать конечные автоматы).
…
(>>shim1, flagobnov, glavnaia, sh1, sl1, d5shimvkl
Имена функций и переменных просто жесть (1С-ное прошлое?))
К 1с я не причастен, а что конкретно Вам не нравится в названиях?
…
(Magic numbers?)
В тексте есть пояснение:
«Диапазон значений ШИМ от 0 до 255, ардуина получает (от клиента) значения в диапазоне от 0 до 100, которые внутри программы умножаются на 2.55 и выводятся на «ножку».»
Раз 20 подряд. Нет ощущения, что можно как-то более изящно написать?
>>switch (descript[3])
Свитч на пару страниц…)
Вы правы, можно всё записать короче, но я преследовал максимальную читабельность и удобство изятия/вставки блоков.
Для «новичков», на мой взгляд, так будет понятнее (в дальнейшем они сами научатся писать конечные автоматы).
…
(>>shim1, flagobnov, glavnaia, sh1, sl1, d5shimvkl
Имена функций и переменных просто жесть (1С-ное прошлое?))
К 1с я не причастен, а что конкретно Вам не нравится в названиях?
…
(Magic numbers?)
В тексте есть пояснение:
«Диапазон значений ШИМ от 0 до 255, ардуина получает (от клиента) значения в диапазоне от 0 до 100, которые внутри программы умножаются на 2.55 и выводятся на «ножку».»
>>Вы правы, можно всё записать короче, но я преследовал максимальную читабельность и удобство изятия/вставки блоков.
Не понятно где тут читабельность, если свич приходится мотать туда-сюда две страницы. Стоило хотя бы вынести каждый case в отдельную процедуру. Кстати процедур получится в разы меньше чем количество case — в вашем коде на самом деле три или четыре варианта case'ов просто с разными номерами ножек. Так и просятся отдельные процедуры.
>>К 1с я не причастен, а что конкретно Вам не нравится в названиях?
Транслит, конечно. Это конечно не криминал, но моветон в любой программе. Язык программирования на базе английского — давайте правильные английские имена (ШИМ==PWM, flagobnov == renew_flag и т.п. ) И несодержательные имена sh1 и sl1.
>> которые внутри программы умножаются на 2.55
По-хорошему, нужно объявить:
#define PWM_MULTIPLIER 2.55; //пояснение
>>и выводятся на «ножку».»
Все ножки тоже стоит объявить константами (или #define'ами). Так во-первых читабельность повысится
#define PWM_D5 5;
…
analogWrite(PWM_D5, shim1 * PWM_MULTIPLIER); // включаем ШИМ D5
А во-вторых можно будет легко поменять при необходимости значения ножек в одном единственном месте, а не лазить по всему коду, выискивая номер ножки.
>>Для «новичков», на мой взгляд, так будет понятнее (в дальнейшем они сами научатся писать конечные автоматы).
Новичок просто стащит ваш код в свой проект. И налепит сверху еще менее симпатичные вещи.
Не понятно где тут читабельность, если свич приходится мотать туда-сюда две страницы. Стоило хотя бы вынести каждый case в отдельную процедуру. Кстати процедур получится в разы меньше чем количество case — в вашем коде на самом деле три или четыре варианта case'ов просто с разными номерами ножек. Так и просятся отдельные процедуры.
>>К 1с я не причастен, а что конкретно Вам не нравится в названиях?
Транслит, конечно. Это конечно не криминал, но моветон в любой программе. Язык программирования на базе английского — давайте правильные английские имена (ШИМ==PWM, flagobnov == renew_flag и т.п. ) И несодержательные имена sh1 и sl1.
>> которые внутри программы умножаются на 2.55
По-хорошему, нужно объявить:
#define PWM_MULTIPLIER 2.55; //пояснение
>>и выводятся на «ножку».»
Все ножки тоже стоит объявить константами (или #define'ами). Так во-первых читабельность повысится
#define PWM_D5 5;
…
analogWrite(PWM_D5, shim1 * PWM_MULTIPLIER); // включаем ШИМ D5
А во-вторых можно будет легко поменять при необходимости значения ножек в одном единственном месте, а не лазить по всему коду, выискивая номер ножки.
>>Для «новичков», на мой взгляд, так будет понятнее (в дальнейшем они сами научатся писать конечные автоматы).
Новичок просто стащит ваш код в свой проект. И налепит сверху еще менее симпатичные вещи.
(вынести каждый case в отдельную процедуру.)
Если Вас не затруднит, приведите пример.
…
(Все ножки тоже стоит объявить константами)
Это само собой, в обозримом будущем.
Если Вас не затруднит, приведите пример.
…
(Все ножки тоже стоит объявить константами)
Это само собой, в обозримом будущем.
Как-то так:
void setOutput(uint8_t pin, uint8_t state) //процедура управления ножкой № pin
{
digitalWrite(pin, state); // вкл d2
d2 = 1; // ставим флаг в единицу (вкл)
EEPROM.write(pin, d2); // записываем состояние d2 в ячейку №pin EEPROM
glavnaia(); // отправка ответа
}
void pwmAdd(int & pwm, uint8_t pin) //Увеличение ШИМ на ножке pin
{
pwm++; // прибавляем
if(pwm > 100) pwm = 100; // если больше ста, то будет сто
EEPROM.write(pin, pwm); // записываем значение в ячейку №5 EEPROM
analogWrite(pin, pwm * 2.55); // включаем ШИМ D5
glavnaia(); // функция отправки ответа
break;
}
void pwmDec(int & pwm, uint8_t pin) //Уменьшение ШИМ на ножке pin
{
pwm--;
if(pwm < 1) pwm = 0;
EEPROM.write(pin, pwm);
analogWrite(pin, pwm * 2.55);
glavnaia();
break;
}
…
case 'A': // d2 вкл
setOutput(2, HIGH);
break;
case 'a': // d2 откл
setOutput(2, LOW);
break;
case 'B': // d3 вкл
setOutput(3, HIGH)
break;
case 'b': // d3 откл
setOutput(3, LOW)
break;
и т.д.
case 'D': // d5 прибавляем shim1
pwmAdd(shim1, 5);
break;
case 'd': // d5 убавляем shim1
pwmDec(shim1, 5);
break;
case 'E': // d6 прибавляем shim2
pwmAdd(shim2, 6);
break;
case 'd': // d5 убавляем shim1
pwmDec(shim2, 6);
break;
и т.п.
Если идти дальше, то стоило бы задать массивы управляющих символов и номеров портов и вообще избавится от switch. Или класс порта сделать, инкапсулирующий всю его логику управления.
Потому как если кто-то будет делать то же самое на Arduino Mega, например, там из-за количества портов портянка кода будет совсем уже неприличной длины.
void setOutput(uint8_t pin, uint8_t state) //процедура управления ножкой № pin
{
digitalWrite(pin, state); // вкл d2
d2 = 1; // ставим флаг в единицу (вкл)
EEPROM.write(pin, d2); // записываем состояние d2 в ячейку №pin EEPROM
glavnaia(); // отправка ответа
}
void pwmAdd(int & pwm, uint8_t pin) //Увеличение ШИМ на ножке pin
{
pwm++; // прибавляем
if(pwm > 100) pwm = 100; // если больше ста, то будет сто
EEPROM.write(pin, pwm); // записываем значение в ячейку №5 EEPROM
analogWrite(pin, pwm * 2.55); // включаем ШИМ D5
glavnaia(); // функция отправки ответа
break;
}
void pwmDec(int & pwm, uint8_t pin) //Уменьшение ШИМ на ножке pin
{
pwm--;
if(pwm < 1) pwm = 0;
EEPROM.write(pin, pwm);
analogWrite(pin, pwm * 2.55);
glavnaia();
break;
}
…
case 'A': // d2 вкл
setOutput(2, HIGH);
break;
case 'a': // d2 откл
setOutput(2, LOW);
break;
case 'B': // d3 вкл
setOutput(3, HIGH)
break;
case 'b': // d3 откл
setOutput(3, LOW)
break;
и т.д.
case 'D': // d5 прибавляем shim1
pwmAdd(shim1, 5);
break;
case 'd': // d5 убавляем shim1
pwmDec(shim1, 5);
break;
case 'E': // d6 прибавляем shim2
pwmAdd(shim2, 6);
break;
case 'd': // d5 убавляем shim1
pwmDec(shim2, 6);
break;
и т.п.
Если идти дальше, то стоило бы задать массивы управляющих символов и номеров портов и вообще избавится от switch. Или класс порта сделать, инкапсулирующий всю его логику управления.
Потому как если кто-то будет делать то же самое на Arduino Mega, например, там из-за количества портов портянка кода будет совсем уже неприличной длины.
Клёво! ) У меня в «своих» проектах реализовано почти так же, только код довольно таки путаный и переменных лишних понатыкано (поэтому и решил выложить «простыню»).
У Вас «чистенько» получилось. Спасибо.
…
Может тогда и по этому вопросу вразумите? Если конечно не затруднит.
(то стоило бы задать массивы управляющих символов и номеров портов и вообще избавится от switch. Или класс порта сделать, инкапсулирующий всю его логику управления. )
У Вас «чистенько» получилось. Спасибо.
…
Может тогда и по этому вопросу вразумите? Если конечно не затруднит.
(то стоило бы задать массивы управляющих символов и номеров портов и вообще избавится от switch. Или класс порта сделать, инкапсулирующий всю его логику управления. )
Зачем Blynk, если есть я? ) Да вообще, зачем писать программы, если уже есть похожие?
Для обучения, очевидно. Автор молодец, что сделал все это сам, а не поюзал готовый проект. Фреймворковый подход плохо работает на контроллере с несколькими килобайтами флеш-памяти.
Фреймворковый подход отлично работает, особенно когда либа занимает не много.
(Если решение решает вашу задачу, то почему бы им не воспользоватся?)
Увы, Blynk не решает моей задачи.
Неторопливо пишется (увлекаюсь этим года четыре) своя, полноценная «среда» с большими возможностями.
Сейчас это только лишь малая часть замысленного — «шаблон» для начинающих, не знающих с какой стороны подойти к вопросу.
Увы, Blynk не решает моей задачи.
Неторопливо пишется (увлекаюсь этим года четыре) своя, полноценная «среда» с большими возможностями.
Сейчас это только лишь малая часть замысленного — «шаблон» для начинающих, не знающих с какой стороны подойти к вопросу.
Ну так Блинк токо пример. Есть 100-500 готовых клаудов которые делают то же + бесплатно + для любых железок… Гугл в помощь «iot cloud».
В плане обучения — ок, но как решение, оно уже позади мира на 5 лет.
В плане обучения — ок, но как решение, оно уже позади мира на 5 лет.
Благодарствую, а не подскажите нечто русскоязычное?
… Или что-то конкретное.
Из тех решений, с которыми я знаком, достаточно много недоработок. При этом подобные вещи позиционируются как законченый продукт.
Из тех решений, с которыми я знаком, достаточно много недоработок. При этом подобные вещи позиционируются как законченый продукт.
Вот www.kaaproject.org например опенсорсная разработка. Правда на яве. Вроде как даже от украинских разработчиков. Их реально сотни и я не слежу за ними и в них явно меньше недоработок чем у Вас =), не в обиду. Уверен что вы сможете нагуглить и русскоязычные, если это критично.
Я это делал три года назад, была нужна управляемая теплица, загородом. Сейчас решил выложить всё, что делал, поэтапно. Может кому-то пригодится.
Например: Теплица расположена в 150 км от города.
Интернет сомнительного качества (gsm-модем).
…
МК управляющий всем, подключён к автономному источнику питания. Основной способ общения с устройством через интернет, резервный — отдельный gsm-модуль.
В определённое время включаются лампы (ДНАТ 600W — потребляет 1200W ), таких шесть штук. Включаться должны с интервалом в пять минут, если все вместе включать, то могут не разжечься.
Лампы нагревают помещение — включается вытяжка, температура падает — вытяжка отключается.
Лампы отключаются — через час включается душ (на несколько секунд). Температура падает, включаются радиаторы и поддерживают температуру.
Время от времени подаётся СО2, из балона.
Земля подсыхает — включается полив.
Отключают электроэнергию, отваливается интернет или ещё что, тогда по GSM приходит оповещение и можно смсками общаться с устройством.
Включают электроэнергию — система должна прийти в рабочее состояние, в частности включить лампы поочереди или обогреватели.
Если появился дым, то включается душ и шлётся смс.
…
Всем этим хозяиством (настройки времени включения, полив, душ, СО2, температура и т.д.) нужно управлять через веб-морду, так как пользовались этим, люди далёкие от программирования.
Вряд ли бы нашлось готовое решение с подобным функционалом.
Интернет сомнительного качества (gsm-модем).
…
МК управляющий всем, подключён к автономному источнику питания. Основной способ общения с устройством через интернет, резервный — отдельный gsm-модуль.
В определённое время включаются лампы (ДНАТ 600W — потребляет 1200W ), таких шесть штук. Включаться должны с интервалом в пять минут, если все вместе включать, то могут не разжечься.
Лампы нагревают помещение — включается вытяжка, температура падает — вытяжка отключается.
Лампы отключаются — через час включается душ (на несколько секунд). Температура падает, включаются радиаторы и поддерживают температуру.
Время от времени подаётся СО2, из балона.
Земля подсыхает — включается полив.
Отключают электроэнергию, отваливается интернет или ещё что, тогда по GSM приходит оповещение и можно смсками общаться с устройством.
Включают электроэнергию — система должна прийти в рабочее состояние, в частности включить лампы поочереди или обогреватели.
Если появился дым, то включается душ и шлётся смс.
…
Всем этим хозяиством (настройки времени включения, полив, душ, СО2, температура и т.д.) нужно управлять через веб-морду, так как пользовались этим, люди далёкие от программирования.
Вряд ли бы нашлось готовое решение с подобным функционалом.
И да, забыл пока писал, спасибо за ссылку.
Я поизучал вчера, получается работает только с андройдом?
А Вы имееете к этому причастие? Просто некоторые вещи непонятны, и хотелось спросить.
А Вы имееете к этому причастие? Просто некоторые вещи непонятны, и хотелось спросить.
Не совсем понял, что Вы хотели сказать.
У меня, к сожалению, нет ни одного устройства на Андройд. (и честно говоря мне не понятно, зачем привязываться к конкретной ОС) Интернет-шилда тоже нет. Можно ли, как-то без андройда и инет-шилда попробовать?
Есть айпад, роутер и ардуина (в ближайшее время приедет ESP8266).
Кстати, по ссылке www.souliss.net, для работы с модулем ESP8266, предлагается модифицированная IDE Arduino, но только для Win.
Есть айпад, роутер и ардуина (в ближайшее время приедет ESP8266).
Кстати, по ссылке www.souliss.net, для работы с модулем ESP8266, предлагается модифицированная IDE Arduino, но только для Win.
установите среду для работы с Android. В среде есть симулятор Анроид
А как быть тем, у кого нет андройда?
…
Установлена последняя IDE, компилятся любые примеры из библиотеки, кроме Hello_ESP8266.
e08_Hello_ESP8266.ino:23:25: fatal error: ESP8266WiFi.h: No such file or directory
compilation terminated.
Ошибка компиляции.
Спасибо.
Спасибо. Из предыдущего поста заработало, буду ждать модуль. Когда придёт, попробую ради любопытства, андройд возьму у соседа.
Как происходит обмен данными? У меня следующим образом:
Нажал на кнопку на html-странице (страничка ждёт ответа) ⇨ полетел символ (например А — включить d13) на сервер ⇨ сервер передал его php-файлу, php-файл приделал к символу дескриптор 'Y+=Z', получилось 'Y+=ZА' и отправил эту строку ардуине (и тоже ждёт ответа) ⇨ ардуина выполнила команду и отправила ответ ⇨ ответ вернулся по цепочке обратно в html-страничку и она отобразила состояние.
Каждую секунду (регулируется) у ардуины запрашивается состояние всей переферии. Если что-то включили/отключили с одного устройства, то максимум через секунду это отобразится на других.
Нажал на кнопку на html-странице (страничка ждёт ответа) ⇨ полетел символ (например А — включить d13) на сервер ⇨ сервер передал его php-файлу, php-файл приделал к символу дескриптор 'Y+=Z', получилось 'Y+=ZА' и отправил эту строку ардуине (и тоже ждёт ответа) ⇨ ардуина выполнила команду и отправила ответ ⇨ ответ вернулся по цепочке обратно в html-страничку и она отобразила состояние.
Каждую секунду (регулируется) у ардуины запрашивается состояние всей переферии. Если что-то включили/отключили с одного устройства, то максимум через секунду это отобразится на других.
Sign up to leave a comment.
Шаблон интерфейса для «умного дома» на Ардуино — вторая часть