Сообщество - Arduino & Pi

Arduino & Pi

1 493 поста 20 825 подписчиков

Популярные теги в сообществе:

173

Проект GSM/GPRS сигнализации на Arduino ч.3

Всех с праздником. Продолжаем совершенствовать нашу сигнализацию. Согласитесь, что ей очень не хватает беспроводных датчиков. Один из подписчиков попросил добавить в сигнализацию ИК-передатчик для управления кондиционером. Мы решили этот вопрос несколько иначе, но сама идея передачи данных по ИК-каналу мне понравилась. Комплектующие стоят копейки. Имеется уже готовая библиотека IRremote, позволяющая принимать и отправлять данные по ИК-каналу. Минусом данной технологии можно считать только необходимость прямой видимости между передатчиком и приёмником. При этом ИК-приёмник отлично принимает отражённый от стен и потолка инфракрасный свет. Та что не обязательно, чтобы ик-диод был направлен непосредственно на него. Таким образом, если датчики и сигнализация расположены в одной комнате, можно неплохо сэкономить на комплектующих.

Для того, чтобы сигнализация могла принимать ИК-команды, в неё нужно добавить ИК-приёмник. Я использовал TSOP31238 на 38 кГц . Можно взять любой другой, желательно этой же частоты, т.к. она применяется чаще всего.


Первая ножка модуля - земля, вторая +5В, третья - информационный выход. Его соединяем с 11 пином Ардуины в сигнализации. У других ИК-приёмников распиновка может отличаться.

Далее открываем файл настроек проекта libraries/main_type/settings.h

Подключаем библиотеку ИК-датчика через дефайн, записав в него 1.

# define IR_ENABLE 1 // библиотека для ик приёмника

Затем добавляем ИК-датчик в массив датчиков:

где

IR_SENSOR - тип датчика

"IR_0" - уникальное имя датчика. Будет выводиться в отчётах. Пишите любое своё, например "OKNO" или "KOMNATA".

0x41038C7 - 32 разрядное кодовое слово, передаваемое беспроводным датчиком при срабатывании. Можно указать любое другое. Оно будет отправляться датчиком при тревоге. Соответственно это же слово нужно зашить в датчик.

Если ИК-датчиков несколько, можно настроить их на передачу разных слов, тогда в массиве каждый датчик нужно прописать отдельно. Это позволит их различать.


Прошиваем сигнализацию.


Теперь настало время собрать беспроводной ИК-датчик.


Для этого нам понадобится Ардуино Нано, ИК-диод, чем мощнее, тем лучше. Его нужно подключить к 3 пину Ардуины через ограничивающий резистор 33-220 Ом. Далее начиная с 4 пина подсоединяем любые датчики. Точно так же, как мы это делали в сигнализации. Оба проекта используют одни и те же библиотеки.

Затем открываем файл настроек settings.h

Задаём код, который будет отправляться на ИК-приёмник. Мы уже указывали его при настройке датчиков сигнализации. Код должен совпадать, чтобы сигнализация могла понять, кто сработал.

#define IR_CODE 0x41038C7

Далее указываем размер отправляемого слова в битах

#define IR_CODE_BIT_SIZE 32

В примере проекта к беспроводному датчику подключено два сенсора, геркон и датчик движения. Поэтому мы сначала задаём номера пинов для сенсоров, начиная с 4 (4 и 5 в данном случае). Затем записываем в массив сенсоров два датчика.

На этом настройка проекта завершена. Можно прошиваться.


При срабатывании подключенного сенсора Ардуина ИК-датчика начнёт отправлять указанное нами слово по ИК-каналу. Количество повторов отправки определено дефайном

# define ALARM_MAX_TIME 10

Отправка слова производится раз в секунду.

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


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

Обновлённая прошивка с проектом для ИК-датчика IRsensor лежит здесь

https://github.com/wisenheimer/Arduino


Так же необходимо установить через Arduino IDE библиотеку IRremote

или скачать её по этой ссылке https://github.com/z3t0/Arduino-IRremote


PS

В проекте добавилась новая библиотека для работы с датчиками температуры на основе термистора. Все необходимые коэффициенты задаются в самой библиотеке.

----------------

В следующей части постараюсь показать беспроводной датчик c Wi-Fi модулем.


Всем добра.

Показать полностью 6
190

Подключение 7-дюймового экрана с тачскрином (Waveshare) к Arduino

Появилась у меня задача сделать один проект с экраном 7 дюймов с тачскрином. До этого я работал только со стандартными экранчиками под ардуинку не более 4.5 дюймов, которых много есть различных моделей в магазинах. А вот с экранами побольше выбора почти нет, да и информации мало. После долгих изучений я нашел 3 варианта:

1) делать проект на Raspberry, но выйдет намного дороже по комплектующим

2) использовать дисплей Nextion, но он тоже не дешевый и я хочу сделать проект на ESP32 с возможностью удаленной прошивки контроллера по воздуху, а с Nextion такое, как я понял, не получится.

3) с использованием контроллера RA8875


Первые два варианта я оставил как запасные, если не удастся с третим. По поводу RA8875 - есть отдельно готовый модуль от Adafruit https://www.adafruit.com/product/1590, но стоит он тоже многовато, а с учетом того, что нужно еще и экран покупать, то выйдет дороговато. А есть уже готовые модули с этим контроллером и экраном с тачскрином (резистивным или емкостным). Я остановился на таком варианте https://www.waveshare.com/7inch-capacitive-touch-lcd-c.htm

И вот приехал мне этот дисплей с алишки за 47$ как раз перед Новым годом. Сразу же запаял штырьки в правый нижний блок (2х7), так как подключать я его собирался по SPI, а слева выводы под паралельный интерфейс. Библиотеку взял https://github.com/adafruit/Adafruit_RA8875 Но сразу ничего не получилось. Пришлось изучать даташити на этот контроллер и искать информацию в интернете. И вот я наткнулся на одну статью (https://github.com/sumotoy/RA8875/wiki/Various-RA8875-based-...), где написано, что на этом дисплее не выведен SPI и подключить его не получится. Я уже расстроился и подумал, что придется пилить на Raspberry, но продолжил изучать даташиты. Сравнив схемы этого модуля и модуля Adafruit я увидел, что все сходится и SPI там выведен. Но тут выведены еще контакты PS, SIFS0,1, I2CA0,1. Изначально я их не подключил, но в даташите написано, что есть несколько режимов работы контроллера RA8875 - паралельный интерфейс, SPI 3-wire, SPI 4-wire, I2C. И в зависимости от того, какой режим используется надо эти контакты завести на VCC или GND.


И так в случае SPI 4-wire схема подключения такая:

PS - VCC

SIFS0 - GND

SIFS1 - VCC

IICA0 - GND

IICA1 - GND

SDO - MISO

SDI - MOSI

SCL - SCL

CS - любой цифровой выход

LCD_RST - любой цифровой выход

RS_INT - любой цифровой вход


После такого подключения экран заработал:

Сразу хочу уточнить, что ESP32 работает на 3.3В, но если вы захотите подключить экран к Arduino , которая работает на 5В, то нужно согласование уровней, а то можете спалить дисплей (http://we.easyelectronics.ru/Shematech/soglasovanie-logiches...)


После этого начал разбираться с тачскрином. В этой же библиотеке Adafruit_RA8875 есть возможность работы с тачскрином, а на контроллер RA8875 должны быть заведены контакты тачскрина Y+, Y-, X+, X- Но это сработает только в случае резистивного тача. А у меня модуль с емкостным и контакты его заведены на контроллер GT811. И тут опять возникла проблема: нет ни одной библиотеки для подключения этого контроллера к ардуино. Подключается он по I2C  - 4 нижних контакта на этой же колодке (2х7):


SDA - I2C_SDA

SCL - I2C_SCL

СT_RST - любой цифровой выход

CT_INT - любой цифровой вход


Пришлось опять читать даташиты и искать в интернете информацию. Была найдена библиотека на GT811 для контроллера GD32 - аналог STM32 (https://github.com/pysco68/waveshare-hid/blob/master/src/gt8...) Детально ее изучив, переписал на простую библиотеку под ардуино https://github.com/levkovigor/GT811

На данном тачскрине можно отслеживать до 5 одновременных касаний.


Теперь остается только откалибровать координаты тачскрина относительно координат экрана и можно пилить проект.

Показать полностью 2
95

Задача - умный счётчик воды

Приветствую всех пользователей сообщества , столкнулся с небольшой задачей, которую без вашего совета решить не в силах .


Проблема:

Есть пожилой человек (живёт в квартире один)  и этот человек в силу возраста постоянно забывает выключать кран с водой . За месяц может набежать 17-19 кубов воды на одного человека.

Соответственно и счёт за воду огромный и большой риск затопить соседей


Задача:

Установить связку  = Счётчик + Эл. устройство счёта +Эл. клапан 

(или возможно кто-то подскажет уже  готовое решение)


Счётчик - стандартный счётчик воды как на фото


Эл. устройство счёта - arduino ,  orange pi или другой небольшой компьютер которое бы считало , сколько литров воды израсходовано за день, и если израсходовано было больше установленной нормы - идёт команда клапану на закрытие

Эл. клапан - простая задвижка


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

Заранее благодарю

Задача - умный счётчик воды
Показать полностью 1
772

Pet Detector оповестит когда ваш кот просится домой

Что делать, если ваш кот проситься в дом громким мяуканьем и часами ждет под дверью, пока вы его заметите? Для решения этой проблемы энтузиаст EdgeElectronics создал Pet Detector — устройство, которое присылает уведомление хозяину на смартфон, если кот находится у двери.
Pet Detector оповестит когда ваш кот просится домой

Как сообщается, гаджет основан на одноплатном компьютере Raspberry Pi, оснащенном камерой, направленной в сторону входа в помещение. Решение работает на скрипте Python, который при помощи модели TensorFlow MobileNet-SSD распознает объекты в видеопотоке.


Детектор определяет две области — «внутреннюю» (животное находится в доме и хочет выйти на улицу) и «внешнюю» (кот просится домой). Если питомец пребывает в них в течение 10 последовательных кадров (стоит учесть, что FPS у Pet Detector составляет немногим выше 1 кадра в секунду), то посредством API Twilio устройство отправляет на смартфон владельца сообщение с информацией о том, что животное хочет войти — или, наоборот, выйти.


Исходный код Pet Detector и подробная инструкция по его созданию опубликованы на GitHub.

Источник: itc.ua

Показать полностью 1 1

Помогите с ЖиПеЕс

Здравствуйте дорогие пикабушники . Пришел сюда с таким вопросом , есть у меня 24 лазерных оружия и 24 шлема , лазертаг короче . Встал такой вопрос , можно ли как-то каждый набор отслеживать перемещение , и потом на одну карту Гугл их занести , что б распечатать ?

21

Передача звука по бт на ардуино

Скажите, опытные ардуинщики - возможно ли сотворить на ардуино приблуды которая будет брать звук с 3.5 и передавать по бт? На онлайн-площадках я уже был и видел такие девайсы, мне интересен сам принцип. Поиск ничего не дал

Повышение мощности на бесколлекторном вентиляторе

Имеется кулер(12В 0.14А) и БП(12В) большой мощности. Не устраивает мощность кулера, хочу ее увеличить с помощью усилителя тока на транзисторе. Внимание знатоки:

1) что будет при увеличении тока на кулере(мб лучше повышать мощность через напругу, имеется трансформатор на 220-18В 1А, но данный способ сложнее(менее практичная установка будет), следовательно менее актуален для меня)?

2) возможно в цепи будет 2 кулера, возможно с разной номинальной силой тока. Если кто то примерно представит схему подключения и реализацию с рассчитанными номиналоми, тому мое большое почёт и уважение)

3)поиски в интернете привели меня сюда, пришлось сдувать 9 месячную пыль с аккаунта, надеюсь на квалифицированных пикабушников)

678

Проект GSM/GPRS сигнализации на Arduino ч.2

Приветствую моих читателей. В первой части https://pikabu.ru/story/proekt_gsmgprs_signalizatsii_na_ardu... я рассказал вам, как сделать простую GPRS сигнализацию на Ардуино. Проект продолжает развиваться. Сигнализация эксплуатируется около месяца, и уже можно подводить некоторые итоги. За это время не было ни одного случая отказа или зависания, как модуля SIM800L, так и самой Ардуины. Напомню, в моём проекте микроконтроллер питается напрямую от аккумулятора пониженным напряжением 4 В. К каким-то отказам, как опасались многие читатели, это не приводит. Мною был проведён эксперимент, чтобы узнать, как поведёт себя сигнализация при постепенном разряде батареи.

Так как Ардуина разряжала аккумуляторы очень медленно, я подключил её вместе с модемом к лабораторному источнику питания, выставил ограничение по току 2А, и проверил работу на различных значениях напряжения.

Что удалось выяснить. При 3,5 В и выше SIM800L работает штатно. С питанием 3,4 В иногда начинаются перезагрузки при входящих звонках. При снижении напряжения ниже 3,4 В отваливается сеть, могут начаться перезагрузки, но на AT команды модуль продолжает отвечать. Так он работает в плоть до 3В, после чего выключается.

Ардуина работает даже при напряжении 2,7 В, ниже которых отключается. Никаких сбоев отмечено не было.

Но этого нам не достаточно. Нужно было проверить работу при длительной разрядке аккумулятора. Так сказать в условиях, близких к боевым. Я отключил режим сна Ардуины, подключил дополнительную нагрузку к аккумулятору, включил Serial монитор, и отслеживал поведение сигнализации, периодически проверяя её работоспособность. Эксперимент продолжался более суток. Аккумулятор разрядился до 3,6 В. Сбоев замечено не было. Схема полностью работоспособна.  Ставьте ёмкий аккумулятор и не о чём не думайте.

Для справки. Номинальное напряжение питания чипа зависит от частоты его работы. Если программно понизить частоту до 10МГц или ниже, то питание напряжением от 2,7 до 5,5В для Atmega328p будет стандартным. Если кого-то не убедили результаты эксперимента, то они могут  поиграться с настройками частоты.


С этим разобрались, теперь поговорим о доработках проекта.


За прошедшие две недели проект претерпел некоторые изменения. Геркон теперь подтянут через резистор не к +5В, а к +4,2В батареи (см. фото). Что позволит сохранить на пине высокий уровень при отключении внешнего питания без программной подтяжки. Мне кажется это более надёжным решением. Резисторы можно использовать любого номинала, начиная с 2,2 кОм и выше.


Остальные доработки касаются программной части. Файл настроек settings.h получил новые опции. https://github.com/wisenheimer/Arduino/blob/master/libraries...


По рекомендации читателей, в проект был добавлен watchdog (WTD), который перезагрузит Ардуину в случае её зависания. Включен по умолчанию следующим дефайном:

Т. к. стандартный загрузчик Ардуино Нано не поддерживает watchdog, и в случае его срабатывания уходит в бесконечную перезагрузку, для его работы нужно либо сменить загрузчик на другой, либо поступить проще. Прошить Ардуину через программатор. В этом случае на Ардуине больше не будет загрузчика. И watchdog будет работать. Но вы уже не сможете прошивать Ардуину по USB. Если вас это не устраивает, не используйте watchdog.


В качестве программатора я применил Ардуино УНО с прошивкой ArduinoISP из примеров.


Следующее изменение касается способа доставки отчётов. Теперь сигнализация поддерживает SMS отправку сообщений. Ранее мы отправляли ответы сигнализации на e-mail при помощи GPRS. Теперь можно выбирать способ отправки. Для этого добавлен следующий дефайн:

По умолчанию включены оба варианта.


SET_FLAG_ONE(GPRS_ENABLE) разрешает отправку e-mail по GPRS.

SET_FLAG_ONE(SMS_ENABLE) разрешает отправку отчётов по SMS.


GPRS имеет более высокий приоритет. Если сигнализации не удалось установить GPRS соединение, и SMS режим разрешён, то сообщения будут отправлены по SMS, флаг GPRS_ENABLE  выключен, и в дальнейшем будет задействована только SMS отправка. Включить или выключить оба режима можно так же в ручную DTMF командой.

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


Следующим нововведением стало изменение списка DTMF команд:

Команды, не вошедшие в список, будут подставлены в USSD запрос и отправлены сотовому оператору. Так что можете в режиме DTMF напирать любые USSD команды. Например запрос баланса. В случае успеха ответ оператора вернётся в виде отчёта.


Админ так же может управлять модемом SIM800L при помощи АТ команд из его даташита http://www.mt-system.ru/sites/default/files/documents/sim800... .


Например, добавлять и удалять номера из телефонной книги. Для этого достаточно с телефона Админа отправить сигнализации SMS с текстом АТ команды.


Дальше хочу подробно рассказать, как добавлять в проект датчики.


Для начала необходимо определиться с количеством пинов, требуемых для ваших датчиков. Датчики у нас подключаются, начиная с 4 пина. Первым желательно выбрать геркон, т.к. он будет будить Ардуину, если она войдёт в режим энергосбережения при отключении внешнего питания.

В файле https://github.com/wisenheimer/Arduino/blob/master/libraries... описан класс Sensor и следующие типы датчиков:

DIGITAL_SENSOR - любой датчик с одним цифровым выходом, на котором может быть только два состояния, 0 или 1.

CHECK_DIGITAL_SENSOR - тоже самое, только с проверкой от ложного срабатывания. Если через 10 секунд датчик сбросил своё значение, то срабатывание считается ложным.  Применяется для тех датчиков, которые удерживают логическое значение на выходном пине при сохранении внешнего воздействия. Например датчик пламени.

ANALOG_SENSOR - любой датчик с аналоговым выходом. Например датчик газа MQ-2.

DHT11, DHT21, DHT22 - датчики температуры и влажности.


Конструктор класса имеет следующий вид:

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

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


Например:

Sensor(DOOR_PIN, DIGITAL_SENSOR, "DOOR", HIGH, 0)

означает, что для датчика двери (геркона) задействован пин Ардуино DOOR_PIN (задан в том же в файле), тип датчика DIGITAL_SENSOR, название датчика, которое будет выводиться в отчётах - "DOOR" (можно заменить на любое другое слово), обычное состояние пина  HIGH (DOOR_PIN у нас подтянут к 4,2В), время подготовки датчика при включении питания в секундах, через которое он начнёт показывать правильные значения - 0 секунд.


Для аналогового датчика газа MQ-2:

Sensor(A0, ANALOG_SENSOR, "GAS", LOW, 120)

пин A0, тип датчика ANALOG_SENSOR, имя  "GAS", значение на пине LOW, на прогрев датчика и выход на номинальный режим работы отводится 120 секунд. До истечения этого времени после включения датчик не опрашивается, что бы не получать неверные значения.


Для датчика температуры DHT11

Sensor(DHT_PIN, DHT11, "DHT", LOW, 10, 35)

в конце появилась цифра 35, которая означает уровень в градусах, при превышении которого считается, что датчик сработал. В помещении стало слишком жарко.


Внимательный читатель уже заметил, что для разных датчиков описано разное количество параметров. Дело в том, что в языке С++ можно не писать все параметры функции, если в заголовке функции указаны их значения по умолчанию. Мы пишем только то, что не имеет значения по умолчанию, или мы хотим задать другое значение. Однако никто не запрещает указать все параметры конструктора класса.


Вы можете подключать к сигнализации любые датчики, не требующие отдельной библиотеки, лишь заполнив конструктор класса, и добавив его в массив Sensor sensors[]. И это будет работать. Если для датчика требуется отдельная библиотека, то её можно добавить точно так же, как в проект была добавлена библиотека stDHT.h для датчика DHT11, который имеет свой протокол для обмена данными. Или напишите мне, я добавлю.


На этом всё, спасибо за внимание.


Скачать проект можно как всегда по ссылке: https://github.com/wisenheimer/Arduino

Показать полностью 7
Отличная работа, все прочитано!