Создавалось все это для автоматического включения и выключения света в курятнике, но применимо и для других целей.
Готовое и собранное устройство может подать на указанный цифровой пин arduino 1 или 0 в период от и до указанного времени в точности до минут (вне периода подается значение противоположное указанному в приложении при добавлении таймера ).
Все параметры указываются в приложении. А вот отсюда поподробнее…
Есть приложение для android в котором необходимо подключиться к блютус модулю и добавить таймер. Приложение интуитивно понятное и думаю проблем с ним не возникнет.

.apk файл будет в папке этого проекта.
Необходимые элементы:
- arduino;
- rtc module ds1307;
- bluetooth module HC-05;
- соединительные элементы(например провода);
- прошивка для arduino; скетч на мой взгляд сложный и лучше в подробности не вдаваться.
- приложение для android;
Разбираемся с arduino и подключаемыми модулями.
Ага, пункты 1-4:

arduino - hc-05 5v - vcc gnd - gnd TX1 - RXD RX0 - TXD arduino - ds1307 5v - 5v gnd - gnd A5 - scl A4 - sda
Не забываем при загрузке скетча отключать пин RX0 на arduino. Вы сказали «скетч»?
5.Скетч в студию:
#include <Wire.h> //библиотека для работы с шиной i2c #include <iarduino_RTC.h> //библиотека для rtc модуля(если cчто, лежит в папке проекта(Timer->firmware_for_timer->iarduino_RTC)) #include <EEPROM.h> //библиотека для работы с энергонезависимой памятью iarduino_RTC time(RTC_DS1307); //создание объекта для работы с модулем реального времени int values; //переменная для получения данных unsigned int to_minutes(unsigned int hours, unsigned int minutes)//функция для перевода часов и минут в минуты { return (60*hours)+minutes; } void setup() { time.begin(); //начало работы часов Serial.begin(9600); //открытие сериал порта } void loop() { if(Serial.available() > 0) //если что-то пришло { values = Serial.read(); time.settime(0,-1, values); //считывание и установка часов delay(50); values = Serial.read(); time.settime(0, values); //считывание и установка минут delay(50); //очищаем энергонезависимую память for (int i = 0 ; i < EEPROM.length() ; i++) { EEPROM.write(i, 0); } ////////////////////////////////// values = Serial.read(); delay(50); //запись данных в энергонезависимую память, полученных с телефона while (values > 0) //пока есть что получать { for(int i = 0; i < 7; ++i) { EEPROM.write(EEPROM.read(EEPROM.length() - 1) * 7 + i, Serial.read()); delay(50); } EEPROM.write(EEPROM.length() - 1, EEPROM.read(EEPROM.length() - 1) + 1); values = Serial.read(); delay(50); } ///////////////////////////////////////// } //проход по каждому таймеру for(int i = 0; i < EEPROM.read(EEPROM.length() - 1); ++i) { if(EEPROM.read(i * 7 + 0) == 1) //если таймер нужно проверять { bool find = 0; //флаг time.gettime(); if((to_minutes(EEPROM.read(i * 7 + 1), EEPROM.read(i * 7 + 2)) <= to_minutes(time.Hours, time.minutes)) && //если пришло время для работы (to_minutes(EEPROM.read(i * 7 + 3), EEPROM.read(i * 7 + 4)) > to_minutes(time.Hours, time.minutes))) { pinMode(EEPROM.read(i * 7 + 5), OUTPUT); //настраиваем пин таймера как выход digitalWrite(EEPROM.read(i * 7 + 5), EEPROM.read(i * 7 + 6)); //посылаем на пин нужное значение } else //иначе если время не пришло { //ищем таймер с таким же пином for (int j = 0; j < EEPROM.read(EEPROM.length() - 1); ++j) { if(EEPROM.read(i * 7 + 5) == EEPROM.read(j * 7 + 5) && (i != j) && (EEPROM.read(j * 7 + 0) == 1)) { //и если нашли таймер с таким же пином и если для него время пришло if((to_minutes(EEPROM.read(j * 7 + 1), EEPROM.read(j * 7 + 2)) <= to_minutes(time.Hours, time.minutes)) && (to_minutes(EEPROM.read(j * 7 + 3), EEPROM.read(j * 7 + 4)) > to_minutes(time.Hours, time.minutes))) //если пришло время для работы { pinMode(EEPROM.read(i * 7 + 5), OUTPUT); //настраиваем пин таймера как выход digitalWrite(EEPROM.read(i * 7 + 5), EEPROM.read(j * 7 + 6)); //посылаем на пин нужное значение find = 1; //поднимаем флаг } } } if(find == 0) //если таймер с таким же пином не найден { pinMode(EEPROM.read(i * 7 + 5), OUTPUT); //настраиваем пин таймера как выход digitalWrite(EEPROM.read(i * 7 + 5), !EEPROM.read(i * 7 + 6)); //посылаем на пин значение противоположное нужному } } } } }
Но все это без приложения будет холодным и неподвижным как камень, поэтому идем дальше.
6.
Приложение интуитивно понятное и думаю проблем с ним не возникнет.
Но лучше разобраться сразу. При первом входе в приложение необходимо будет подключиться к блютус модулю, для этого нажимаем «синхронизировать устройство»
и выбираем наш модуль. При галочке «подключаться автоматически» телефон сам будет пытаться подключиться к блютус модулю, при открытии приложения(эту фишку взял у alex gyver).«таймеры» здесь список всех таймеров и их поиск по имени. При нажатии на имя таймера открывается экран изменения этого таймера. Здесь же(где список таймеров) в правом нижнем углу расположен "+" нажав на который открывается экран добавления таймера, где указывается:
- его имя,
- от какого времени(часы минуты),
- до какого времени(часы минуты),
- управляемый пин,
- значение для него
- и состояние(будет arduino включать его или не будет в нужное время).
Скачать приложение;
Архив проекта;
На этом хочу поблагодарить за внимание и сказать что, если нашли какие-то косяки или баги — смело пишите об этом, будем исправлять.
ссылка на оригинал статьи https://habr.com/ru/post/461561/

Добавить комментарий