Первое что вывел, когда научился выводить кириллицу на LCD дисплее
Первое что вывел, когда научился выводить кириллицу на LCD дисплее, который её не поддерживает.
Библиотека LiquidCrystalRus тут:
Первое что вывел, когда научился выводить кириллицу на LCD дисплее, который её не поддерживает.
Библиотека LiquidCrystalRus тут:
Уже достаточно давно я не писал на тему Arduino – как-то со временем не складывалось. Месяц назад знакомый решил установить водосчетчики, но, ввиду очень неудобно расположенных вводов труб в квартиру, считывать их показания приходилось чуть ли не с фонарем и в крайне неудобной позе. Возник вопрос – а можно ли как-то вывести показания с них на более удобное место или, в дальнейшем, автоматизировать сбор и отправку данных? Дело осложнялось тем, что нужен был бюджетный вариант (не более 1000 рублей) и в крайне короткие сроки. Я решил помочь, и вот что из этого получилось.
Что мы хотим получить:
1. Читать показания со счетчика горячей и холодной воды их состояние и выводить их на экран;
2. Хранить состояние счетчиков в энергонезависимой памяти микроконтроллера на случай пропадания питания;
3. Предусмотреть возможность корректировки показаний;
4. Предусмотреть возможность масштабирования (например, если в будущем мы захотим передавать данные по радиоканалу).
Что нам понадобится:
1. Arduino Nano - 1 шт. ~ 120-170 рублей.
2. Беспаечная макетная плата размера Half+ (хотя, подойдет и большая) – 1 шт. ~ 70 рублей.
3. ЖК-дисплей 2004 или 1602 с I2C-модулем. Если у Вас уже есть такой дисплей без I2С, то можно купить отдельно модуль и подключить его к дисплею. Да и, в принципе, можно обойтись без I2C – но в этом случае существенно увеличится количество проводов. Различие между 2004 и 1602 только в количестве строк и символов: 20x4 и 16x2 соответственно. Можем использовать любой, но я бы рекомендовал 2004 – на него еще и часы выведем) – 1 шт. ~ 350 рублей за 2004 с I2C
4. Модуль часов реального времени. В моем случае использую DS1307. – 1 шт. ~ 45 рублей.
5. Соединительные провода male-male или перемычки – примерно 20 штук длиной около 10 см. ~ 50-140 рублей. Если жаба не подписывает – можно купить моток одножильного тонкого провода и нарезать самим.
6. Клемники для подключения импульсных выводов счетчиков – 2 шт. ~ 10 рублей
7. Тактовая кнопка для включения подсветки дисплея с колпачком на нее – 1 шт. ~ 20 рублей
8. Необязательно: Модуль питания, позволяющий подключить обычный сетевой адаптер 6-12 вольт. Если Вы будете использовать питание через USB или от батареи – то без него можно обойтись. 1 шт. ~ 80 рублей.
9. Необязательно: Предусмотрите коробку, в которой разместите собранный блок. По моему опыту одним из лучших вариантов является бокс для монтажа электрощитков. Размер и стоимость их колеблются от 50 до 700 рублей.
Итого, менее чем за 1000 рублей мы можем собрать довольно удобное устройство для считывания и хранения показаний счетчиков воды.
Принцип работы импульсных счетчиков
На данный момент большинство счетчиков воды снабжены импульсными выходами. Если у вашего такого выхода нет – советую при следующей поверке озаботится их заменой на импульсные. Тем более что, как это ни странно, цена импульсных счетчиков обычно не отличается от простых той же модели (правда, встречал варианты с разницей цены в 100 рублей). Визуально такие счетчики отличаются наличием двухжильного провода. Собственно, внутри счетчика провод подключен к геркону и при проходе через счетчик очередных 10 литров геркон замыкается, а при проходе еще трех – размыкается. Как раз момент замыкания мы и будем ловить.
Описание принципов работы и подключения блока
Импульсные выводы счетчиков подключаем через клемники к нашей Arduino. При замыкании соответствующего выхода счетчик десятков литров увеличивается, соответственно, на 10, а при наборе 1000 литров – обнуляется счетчик литров и увеличивается на 1 счетчик кубометров. Все данные сразу же пишутся в энергонезависимую память EEPROM для того, чтобы при потере питания нам не пришлось бы выставлять начальные значения счетчиков заново.
Затем, при включенном дисплее (дисплей включается по кнопке примерно на 30 секунд) на экран выдаются обновленные значения показаний.
Код
В отличие от предыдущих постов я не буду приводить код прошивки, а остановлюсь только на наиболее важных моментах, которые могут понадобиться при настройке.
Первый запуск, Обязательные параметры
При первом запуске нам надо установить ряд параметров, чтобы считыватель счетчиков верно работал. Таких параметра всего два:
1. Текущее время.
Для автоматической установки времени с компьютера при прошивке микроконтроллера установите значение константы SETTIME в 1 (строка 65). После прошивки и перезапуска, когда время будет установлено, верните значение константы в 0 и прошейте микроконтроллер заново – время будет сохранено в модуле RTC и не потребует повторной установки при пропадании питания. Если все же время не восстановилось после отключения – возможно у Вас разряжена батарея, установленная на модуле RTC: проверьте, при необходимости замените ее и заново установите время через константу SETTIME.
2. Базовые показания счетчиков горячей и холодной воды.
Для этого существуют два массива в строках 30 и 31:
В CounterHighBase содержатся показания кубометров для обоих счетчиков (сначала для холодной, потом для горячей воды), в CounterLowBase – показания для литров (то, что на вашем счетчике обычно обозначается красными цифрами). По умолчанию, если эти значения равны нулям, они берутся из энергонезависимой памяти. Если же любое из этих четырех значений отлично от нуля – оно записывается в память и далее будет считаться как базовое при следующем запуске. Например, если Вам надо при первой установке запомнить уже существующие счетчиков (допустим 01342,234 на счетчике горячей воды и 01637,110 на счетчике холодной), то эти две строки будут выглядеть следующим образом:
Обратите внимание, что лидирующие нули не пишутся – по стандартам языка С с нуля начинается число в восьмеричной системе счисления. После заливки прошивки с этими значениями в Arduino, нам надо перезапустить микроконтроллер и убедиться что значения попали в память (в этом нам поможет константа DEBUG или просто посмотрите на подключенный экран). Затем выставляем эти значения обратно в нули и заново перепрошиваем микроконтроллер.
Необязательные параметры
Следующие параметры не нуждаются в обязательной модификации и понадобятся Вам, например, в том случае, если Вы решили убрать или добавить какой-то модуль, а также если Вы, в силу каких-то причин, не смогли или не захотели использовать полностью аналогичные указанным в схеме компонентам:
1. За настройку параметров экрана отвечают следующие константы:
LED_DELAY – время в миллисекундах, через которое экран будет автоматически гаснуть.
MOD_LCD_AUTO_OFF – По умолчанию установлен в 1. Если сбросить эту константу в 0, то автоотключение экрана будет недоступно, экран будет гореть до тех пот, пока мы не нажмем на кнопку включения/выключения экрана.
LCD_COL и LCD_ROW – Устанавливает количество строк и символов в строке на LCD-дисплее. Если количество строк больше двух, то в последней строке будет отображаться текущая дата и время.
2. Константы MOD_LCD и MOD_RTC – отвечают LCD-дисплей и часы реального времени. По умолчанию установлены в 1(включено). Если выставим MOD_LCD в 0, то информация на дисплей выдаваться не будет, но будет обрабатываться и сохраняться в памяти. Для чего это надо? Ну, например, если мы будем передавать данные со счетчиков по радиоканалу на некий приемник (как организовывать радиоканал я описывал в одном из предыдущих постов) – в этом случае для уменьшения потребления энергии дисплей мы можем отключить.
Константа MOD_RTC во включенном состоянии (1) указывает, что в системе присутствует модуль часов реального времени. Все данные, полученные со счетчиков будут запоминаться с учетом времени изменения. Также при отключении питания часы не надо будет выставлять заново. При отключенных часах этот функционал будет недоступен.
3. Константа DEBUG. По умолчанию выключена. Если включить ее (установить в 1) то, при подключении к компьютеру через USB-порт, лог событий можно будет просматривать в реальном времени (например, через “Монитор порта” в ArduinoIDE).
4. Константы BUTTON_PIN, HOT_COUNTER_PIN, COLD_COUNTER_PIN указывают, к каким выходам Arduino подключены кнопка выключения дисплея, счетчики горячей и хоодной воды.
Итого, если Вы соберете схему в точности с представленной в данном посте, Вам, для успешного запуска будет достаточно двух вещей:
1. Правильно установить время;
2. Установить значения счетчиков на момент подключения.
В результате у нас получается вот такое устройство:
Что дальше?
Как я уже сказал, данный скетч разрабатывался с целью дать возможность легко подключать и отключать функциональные модули. Например, воспользовавшись одним из моих предыдущих постов, Вы легко сможете модифицировать код так, чтобы данные, считанные со счетчиков передавались по радиоканалу на другую Arduino, допустим, подключенную к локальной сети, а оттуда выводились в базу данных или на веб-страницу. Также, подключив GSM-модем или GSM-модуль организовать автоматическую передачу данных, например, в Вашу управляющую компанию. Работа c GSM-модулем или модемом мной еще не описывалась и может быть рассмотрена позднее в отдельном посте.
Ссылки на компоненты, используемые в данном устройстве.
Как уже стало традицией, ниже приведены ссылки на всем известный китайский магазин, где эти компоненты можно заказать.
1. Arduino Nano: Рекомендовал бы вариант вариант с MicroUSB – визуально качество изготовления лучше.
a. C MiniUSB: http://ru.aliexpress.com/item/Free-Shipping-1PCS-Nano-3-0-co...
b. С MicroUSB: http://ru.aliexpress.com/item/Nano-CH340-ATmega328P-MicroUSB...
2. Макетная плата: http://ru.aliexpress.com/item/1pcs-Quality-mini-bread-board-....
3. Часы DS1307: http://ru.aliexpress.com/item/Free-Shipping-I2C-RTC-DS1307-A.... Прошу обратить внимание – в этом лоте их 10 штук. Если нужны только для этой задачи, то лучше не переплачивать и купить одну штуку у другого продавца.
4. Дисплеи:
a. LCD 2004 I2C: http://ru.aliexpress.com/item/IIC-I2C-TWI-2004-Serial-Blue-B...
b. LCD 1602 I2C: http://ru.aliexpress.com/item/Special-promotions-LCD-1602-mo...
c. LCD 1602 без I2C: http://ru.aliexpress.com/item/1602-16x2-HD44780-Character-LC...
d. LCD 2004 без I2C: http://ru.aliexpress.com/item/Free-shipping-LCD-Board-2004-2...
e. I2C-модуль: http://ru.aliexpress.com/item/1pcs-lot-Free-shipping-IIC-I2C...
5. Соединительные провода
a. Шлейф из 40 штук 10 см: http://ru.aliexpress.com/item/Free-shipping-40pcs-10cm-2-54m...
b. Набор перемычек – 140 штук разных размеров : http://ru.aliexpress.com/item/140-pcs-U-Shape-Solderless-Bre...
6. Клемники – 100 штук в упаковке: http://ru.aliexpress.com/item/Free-Shipping-100PCS-2-Pin-Scr.... Если нужны всего две – ищите у другого продавца, например вот: http://ru.aliexpress.com/item/10pcs-2Pin-Plug-in-Screw-Termi...
7. Тактовая кнопка: http://ru.aliexpress.com/item/Free-Delivery-6-6-6MM-6-6-6H-b.... Если нужна всего одна – ищите у другого продавца.
8. Модуль питания MB-102: http://ru.aliexpress.com/item/MB102-Breadboard-Power-Supply-...
9. Если Вы первый раз столкнулись со сборкой чего-то на Arduino, то проще всего будет сразу купить вот такой комплект http://ru.aliexpress.com/item/1-sets-Handy-Portable-Resistor..., чем искать компоненты по отдельности.
Вместо послесловия или к тем, кто задался вопросом “Зачем это вообще здесь?”
1. Да, я видел кучу статей на тему “подключаем счетчики к микроконтроллерам”. Но данная статья рассчитана именно на новичков, по возможности я попытался написать ее так, чтобы человек, мало знакомый с микроконтроллерами все же смог вынести из нее какую-то пользу.
2. Да, я знаю о ESP8266, STM32 и прочих. Но данная статья именно про Arduino (К любителям работать напрямую с мк Atmel это тоже относится).
3. Да, я знаю, что вы напишете код лучше. Но, очевидно, этот код работает, и работает достаточно хорошо (по крайней мере выполняет свои функции). Хотите улучшить? Флаг Вам в руки, никто не помешает это сделать.
В конце традиционно даю ссылку на архив с библиотеками, кодом и схемой самого блока:
http://www.ansealk.ru/files/Arduino-Counters.zip
И вопрос к подписчикам: делать пост про управление Arduino через GSM? Или информации, наличествующей в сети достаточно?
Всем доброго времени суток.
Начну с простого вопроса. Хотели бы вы иметь полностью асинхронную ардуинку с интерпретатором JavaScript и при том иметь возможность открывать скетч прямо с платы? Мне бы хотелось, например. Это дает невероятные возможности как в разработке так и в исполнении кода.
Сегодня при гуглении интерпретатора JS для ардуинки я забрел на сайт Espruino. Оказалось что я нашел нечто большее чем искал.
Очередной клон ардуино? Вовсе нет. В данных платах используются процессоры STM32F103RCT6 ARM Cortex M3 и STM32F401CDU6 ARM Cortex M4. Это дает неплохие возможности для разработки.
В первую очередь меня заинтересовала заявленная возможность использовать JS вместо C++. JS компактней и более ориентирован на простую и быструю разработку. К примеру кусок кода который будет моргать светодиодом будет выглядеть так:
var l;
setInterval( function () {
digitalWrite(LED1,l=!l);
},200);
Никакого единого loop() и монструозных функций. Можно использовать объекты и цепочки вызовов с return.
Из того что на плате стоит интерпретатор выливается следующий огромный плюс. Можно использовать родные для JS setTimeout и setInterval вместо delay, а это дает нам асинхронность выполнения кода т.к. при delay плата тупо прерывает работу на заданное количество мс в случае с setInterval и setTimeout просто запускается таймер и продолжается работа процессора.
Но при чем тут Arduino хотите спросить вы? Да при том что небезызвестная нам Амперка выпускает Espruino в форм-факторе Arduino и большая часть шилдов и датчиков с ней совместима. Благо что все либы на C++.
Сама платка.
Распиновка.
Что хочется добавить. Плата интересная но стоит прилично в чем явно проигрывает ардуине. Из минусов языка это нестрогая типизация переменных. Из плюсов - проект опенсорсный и ядро шьется на другие микрухи. Еще одним минусом является конская стоимость этого чуда на али.
В ближайшее время постараюсь заказать это чудо "российской сборки" и запилить на нем что-нибудь.
Для желающих более подробно ознакомиться с Искрой или Espruino добавляю ссылки.
https://geektimes.ru/company/amperka/blog/273664/ - очень подробно про эспруино и искру.
http://www.espruino.com/ - родной сайт эспруино.
Надеюсь хоть кому-то этот пост будет интересен.)
Привет Arduino комьюнити на пикабу. Хочу представить мой видеообзор Arduino Nano V3 платы:
Почему именно Arduino Nano V3? Да потому что она недорогая(на aliexpress они продаются меньше чем за 1.8 доллара за штуку), к тому же у этой платы есть всё что нужно для старта - крутой микроконтроллер ATmega328(есть ещё версии с урезанным ATmega168, но лучше доплатить пару центов, и взять полноценную ардуинку), поддержка популярных интерфейсов SPI, I²C, UART, что делает плату совместимой с всеми датчиками, к тому же плата довольно таки небольшая по размерах. Вот она на фоне AA батарейки аккумулятора:
На плате присутствует Mini USB разъём, на том же алиэкспресс есть обновлённая версия с Micro USB, кабель с этим разьёмом сейчас есть у каждого, правда опять же такая плата на пару центов будет дороже.
И кстати, это именно и есть та ардуинка, которую я использовал для создания инерционного трекера:
http://pikabu.ru/story/inertsionnyiy_treker_na_baze_arduino_...
Только как вы могли заметить, тут я уже распаял штырьки. Да да, плата приходит в распаянном состоянии, так что придётся немного подымить паяльником.
Ещё советую ардуинку покупать на базе USB-UART преобразователя CH340G - будет меньше проблем с драйверами. Драйвера для CH340G ищутся по первой/второй ссылке в гугле по запросу "CH340G driver".
Подробнее по данной плате можно почитать на официальном русскоязычном сайте по теме ардуино:
http://arduino.ru/Hardware/ArduinoBoardNano
Там же есть отличный форум:
И справка по синтаксису:
По поводу "С чего начать?" я бы посоветовал посмотреть видеоуроки Джереми Блюма:
https://www.youtube.com/playlist?list=PLfDmj22jP9S759DT250VV...Я и сам когда-то смотрел, повторял, учился... Хотя я и сейчас учусь. Мир микроконтроллеров просто громадный, и постоянно развивается, вычислительная мощь растёт, а размеры и цена - падают.
Если вкратце, то наверное всё, дополняйте меня в комментариях если на чём-то не обострил внимание или что-то опустил.
В комментариях к этому посту можно задавать свои вопросы или делиться проблемами, возникшими при работе с Arduino. Я верю в дух ардуинщиков и надеюсь что вы не пройдете мимо своих товарищей, оказавшихся в трудной ситуации. Давайте создадим в нашем сообществе добрую традицию - сегодня помогли вы, завтра помогут вам ;)
Данный пост будет выходить пока что раз в два/три дня, а дальше - в зависимости от его надобности и количества вопросов.
Всем добра и удачных компиляций! :)
Один мой приятель играет в хоккей и когда узнал, что я увлекаюсь программированием МК, попросил сделать ему и его команде таймер на шесть минут.
Задачи поставил следующие:
1. Управление дистанционно (чтобы не подъезжать к табло)
2. Звуковая индикация
3. Световая индикация
4. Возможность прибавлять/убавлять минуты/секунды, а также пауза и сброс таймера
Подобрал следующие компоненты
Ардуино Мини -1шт.
Порядка ста светодиодов красного свечения
Радиоканальные модули на 433 Мгц (приемник и передатчик)
Реле на 12 Вольт
Звуковая сирена "Иволга"
Поскольку я всего лишь любитель в области программирования, то особо прошу не пинать)))
Представляю вам, дорогие пикабушники-радиолюбители, код этого изобретения.
Может кому понадобится еще. Если будут вопросы, обращайтесь. Всегда рад помочь
Собственно сам код:
#include <SevenSegmentDisplay.h> //Библоитека для работы с самыми обычными индикаторами
SevenSegmentDisplay<false, QuadriDigit<9,13,12,11> > ss(2,3,4,5,6,7,8,1); // значение false или true определяет полярность дисплея: общий катод или общий анод
/////////Переменные времени
unsigned m = 6; //минуты: то,что друг просил
unsigned s = 0; //секунды
unsigned t = 0; //общее значение времени
unsigned long preMillis1 = 0;
unsigned long preMillis2 = 0;
unsigned long preMillis3 = 0;
/////////Кнопки. Переменные
int dp = HIGH; //Выход точки в состояние HIGH
int out_relay = LOW; //Выход реле в состояние LOW
unsigned long c = 0;
void setup()
{
// сюда подключаются каналы приемника
pinMode(A0, INPUT); //Старт/Стоп
pinMode(A1, INPUT); //+
pinMode(A2, INPUT); //-
pinMode(A4, OUTPUT); //Выход на реле
pinMode(10, OUTPUT); //Выход на точку
}
void loop()
{/////////работа кнопок/////////////////////////////
if (digitalRead(A0)==HIGH) //Если кнопка нажата и удерживается, то
{
dp_blink(); //мигает точка и
if (millis() - preMillis1 > 1000)
{
preMillis1 = millis();
{
countdown(); //ведется отсчет
}
}
}
else
if (digitalRead(A0)==LOW) //Если кнопка отжата, то
{
digitalWrite (10,HIGH); //точка постоянно горит
}
/////////Прибавление/убавление минут///////////////
if (millis() - preMillis2 > 500) //Задержка полсекунды
{
preMillis2 = millis();
{
if(digitalRead(A1)==HIGH)
{
m++; //на прибавление
c=0; //сброс реле
}
if(digitalRead(A2)==HIGH)
{
m--; //или убавление
if (m == 0) //Если минуты равны 0, то
{
m=0; //присвоить минутам 0
c=0; //сброс реле
}
}
}
}
/////////вывод на индикатор//////////////////////
t = m*100+s;
if (t == 0)
{
relay(); //вызов функции реле
flash(); //вызов функции мигания индиктора
}
ss.print(t);
}
////////Управление реле///////////////////////
void relay()
{
c++;
if (c == 1) //Время работы реле
{
digitalWrite (A4, HIGH);
}
else
digitalWrite (A4, LOW);
}
/////////мигание индикатора: мигает 0:00
void flash()
{
digitalWrite(9, LOW);
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,HIGH);
delay(250);
digitalWrite(9, HIGH);
digitalWrite(13,HIGH);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
delay(250);
}
/////////Отсчет/////////////////
void countdown()
{
if (s>0)
{
s--;
}
else if (s==0 && m>0)
{
s=59;
m--;
}
else if(s==0 && m==0)
{
t=0;
}
}
////////Мигание точки/////////////////////
void dp_blink()
{
if (millis() - preMillis3 > 500)
{
preMillis3 = millis();
if (dp == HIGH)
dp = LOW;
else
dp = HIGH;
digitalWrite(10, dp);
}
}
По ссылке найдете весь проект с библоитекой , а также файлы для Proteus v 7.7
Вот недавно узнал о такой штуке как GVS. Интересная вещь с помощью которой можно повлиять на вестибулярный аппарат. Можно заставить человека пойти влево или вправо. Принцип работы видно на этом видео с 2:05 (на английском)
Вот еще видео где демонстрируется работа GSV. кому лень с 1:30. Видео уже было дня 2 назад
Вот еще одно видео работы GVS
И так к самой сути поста. Я думал попробовать сделать такое, но русской литературы мало на эту тему, приходится копаться на англоязычных сайтах, а там толком не объясняют. Все что я понял это надо подсоединить 2 накладных электрода на внутреннее ухо, подать 9V чтоб ток не превышал 0,7 mA и будет все ОК. Но не работает, может кто "загорится" идеей сделать такой же, будет интересно как это делается. Почему я написал это сюда? Потому что я думаю тут ардуинка может пригодится.
