Автоматическая подача звоков
- Войдите на сайт для отправки комментариев
Сб, 28/05/2022 - 21:59
Добрые люди, помогите пожалуйста дописать и довести до ума скетч.
Необходимо добавить расписание по которому будут включаться реле.
В коде используется таймер(который не работает) хотелось бы чтобы тип расписания звонков менялся путём нажатия на одну кнопку и выводилась информация о типе расписания(всего их 3 (будний день, суббота, сокращённый))
#include <EEPROM.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> //Обьявляем все необходимые библиотеки для работы нашего проекта! #include <RTClib.h> int Relay1 = A4; //Если у вас не Arduino MEGA 2560, DUE, или MEGA 1280, то измените пины на другие! int m = 0; //переменная для меню int tm = 0; //Данная переменная участвует в установке времени, она указывает в какой позиции находится курсор! int tmo = 0; //Аналогично предыдущей переменной! int rs = 0; //Данная переменна используется для графики(Указывает графически на какой строке вы находитесь) int i = 0; //Данная переменная используется для того, что бы в главном меню указывать время до включения или до выключения. LiquidCrystal_I2C lcd(0x27, 16, 2); RTC_DS3231 rtc; //Указываем тип микросхемы часов реально времени. byte loading[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, }; void setup() { rtc.begin(); //Инициализация часиков. lcd.init(); lcd.backlight(); lcd.createChar(1, loading); //Создаем новый символ для нашей анимации загрузки. pinMode(Relay1, OUTPUT); //Тут все просто, обьявляем пины как выходы. //Начало анимации загрузки, она полностью взята с моего прошлого проекта "LCD Menu". lcd.print(" Loading. "); lcd.setCursor(0, 1); for (int i = 0; i < 16; i++) { lcd.print("\1"); delay(250); } delay(500); lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Welcome! "); lcd.setCursor(0, 1); lcd.print(" Auto Call "); delay(2500); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Version:"); lcd.setCursor(0, 1); lcd.print(" V1.0 | Alpha"); delay(2000); lcd.setCursor(0, 0); lcd.clear(); //Окончание анимации загрузки. } void loop() { //Теперь начинается самое интересное! DateTime now = rtc.now(); //Делаем запрос на дату и время с микросхемы! //Теперь я занесу данные о текущем времени и дате в отдельные переменные, так делать не обязательно, но мне так удобнее! int Hour = now.hour(); //Данная переменная хранит часы int Min = now.minute(); //Данная переменная хранит минуты int Sec = now.second(); //Данная переменная хранит секунды int hs = EEPROM.read(0); int ms = EEPROM.read(1); //Обьявляем переменные времени когда сработает реле, они равны значению которое хранится в энергонезависимой памяти. int ss = EEPROM.read(2); int hso = EEPROM.read(3); int mso = EEPROM.read(4); //А эти переменные указывают когда выключится реле! int sso = EEPROM.read(5); int H1 = Hour; int H2 = hs; int H3 = 0; int M1 = Min; int M2 = ms; //Все эти переменные служат для того, что бы правильно считать время до включения и выключения. int M3 = 0; int S1 = Sec; int S2 = ss; int S3 = 0; //Внимание! Если вы используете данный проект в первый раз, или использовали EEPROM перед этим, то разкоментируйте следуещие 2 строчки кода, затем залейте код //в вашу плату, после этого снова закоментируйте. Дело в том, что по умолчанию в EEPROM во всех ячейках записано 255, а нам нужно выставить время срабатывание, так вот //без этих манипуляций на дисплее будет отображатся 255:255:255! Достаточно сделать это 1 раз! EEPROM.write(0, Hour); EEPROM.write(1, Min); EEPROM.write(2, Sec); EEPROM.write(3, Hour); EEPROM.write(4, Min); EEPROM.write(5, Sec); //rtc.adjust(DateTime(2016, 2, 2, 9, 37, 30)); //Тут вы можете настроить время на часиках если оно неправльное! Формат таков: Год, Месяц, День, Час, Минута, Секунда. int key = analogRead(A0); //Обьявляю переменную и заодно присваиваю ей значение аналогового пина 0. //Управление страницами меню(измените значения если они не подходят вам) if (key < 700 && key > 600) { m--; if (m < 0) { m = 1; } } if (key < 50) { m++; if (m > 1) { m = 0; } } if (m == 1 && key > 900 && key < 990) { tm++; if (tm > 3) { tm = 0; } } //Инкремент часов if (m == 1 && rs == 0 && tm == 1 && key < 250 && key > 200) { hs++; if (hs > 24) { hs = 0; } EEPROM.write(0, hs); } //Декремент часов if (m == 1 && rs == 0 && tm == 1 && key < 500 && key > 400) { hs--; if (hs < 0) { hs = 24; } EEPROM.write(0, hs); } //Инкремент минут if (m == 1 && rs == 0 && tm == 2 && key < 250 && key > 200) { ms++; if (ms > 60) { ms = 0; } EEPROM.write(1, ms); } //Декремнет минут if (m == 1 && rs == 0 && tm == 2 && key < 500 && key > 400) { ms--; if (ms < 0) { ms = 60; } EEPROM.write(1, ms); } //Инткремент секунд if (m == 1 && rs == 0 && tm == 3 && key < 250 && key > 200) { ss++; if (ss > 60) { ss = 0; } EEPROM.write(2, ss); } //Декремент секунд if (m == 1 && rs == 0 && tm == 3 && key < 500 && key > 400) { ss--; if (ss < 0) { ss = 60; } EEPROM.write(2, ss); } if (m == 1 && rs == 1 && key < 990 && key > 900) { tmo++; if (tmo > 3) { tmo = 0; } } //Инкремент часов для выключения if (m == 1 && rs == 1 && tmo == 1 && key < 250 && key > 200) { hso++; if (hso > 24) { hso = 0; } EEPROM.write(3, hso); } //Декремент часов для выключения if (m == 1 && rs == 1 && tmo == 1 && key < 500 && key > 400) { hso--; if (hso < 0) { hso = 24; } EEPROM.write(3, hso); } //Инкремент минут для выключения if (m == 1 && rs == 1 && tmo == 2 && key < 250 && key > 200) { mso++; if (mso > 60) { mso = 0; } EEPROM.write(4, mso); } //Декременет минут для выключения if (m == 1 && rs == 1 && tmo == 2 && key < 500 && key > 400) { mso--; if (mso < 0) { mso = 60; } EEPROM.write(4, mso); } //Инкремент секунд для выключения if (m == 1 && rs == 1 && tmo == 3 && key < 250 && key > 200) { sso++; if (sso > 60) { sso = 0; } EEPROM.write(5, sso); } //Декремент секунд для выключения if (m == 1 && rs == 1 && tmo == 3 && key < 500 && key > 400) { sso--; if (sso < 0) { sso = 60; } EEPROM.write(5, sso); } //Изменение строки if (m == 1 && tm == 0 && key < 250 && key > 200) { rs++; if (rs > 1) { rs = 0; } } if (m == 1 && tm == 0 && key < 500 && key > 400) { rs--; if (rs < 0) { rs = 1; } } //Ниже я делаю условия отображения времени в низу первой страницы. То есть до включения или выключения будет отображатся время! if (now.hour() - hs < 0 || now.hour() - hs == 0) { i = 0; } else if (now.hour() - hs > 0 && now.hour() < hso) { i = 1; } else if (now.hour() > hso && now.hour() > hs) { i = 2; } //Теперь начинается отображение на дисплее! if (m == 0) { //Первая строчка где выводится текущее время. lcd.clear(); lcd.setCursor(0, 0); lcd.print("Time: "); lcd.print(Hour); lcd.print(":"); lcd.print(Min); lcd.print(":"); lcd.print(Sec); lcd.setCursor(0, 1); //И с помощью операторов выводится время до включения или время до выключения! if (i == 0) { H3 = hs - now.hour(); if (H3 == 0) { M3 = M2 - M1; } else if (H3 > 0) { M3 = 60 - now.minute() + ms; } if (S3 > 60) { S3 = S3 - 60; M3 = M3 + 1; } if (M3 > 60) { M3 = (M3 - 60); H3 = (H3 + 1); } if (H3 < 0) { H3 = 0; } else if (H3 > 0) { H3 = H3 - 1; } lcd.print("On in: "); lcd.print(H3); lcd.print(":"); lcd.print(M3); lcd.print(":"); if (S1 < S2) { lcd.print(S3 = abs(S2 - S1)); } else if (S1 > S2) { lcd.print(S3 = 60 - S1 + S2); } } else if (i == 1) { S3 = sso + (60 - now.second()); M3 = mso + (60 - now.minute()); H3 = hso - now.hour(); if (S3 > 60) { S3 = S3 - 60; M3 = M3 + 1; } if (M3 > 60) { M3 = (M3 - 60); H3 = (H3 + 1); } lcd.print("OFF in: "); lcd.print(H3); lcd.print(":"); lcd.print(M3); lcd.print(":"); lcd.print(S3); } else if (i == 2) { H3 = 23 - now.hour() + hso; M3 = 60 - now.minute() + ms; S3 = 60 - now.second() + ss; if (S3 > 60) { S3 = S3 - 60; M3 = M3 + 1; } if (M3 > 60) { M3 = (M3 - 60); H3 = (H3 + 1); } lcd.print("ON in: "); lcd.print(H3); lcd.print(":"); lcd.print(M3); lcd.print(":"); lcd.print(S3); } } //Ну и самое главное, что выполняет все функции, это управление пином где подключено реле! if (i == 0) { digitalWrite(Relay1, LOW); } else if (i == 1) { digitalWrite(Relay1, HIGH); } else if (i == 2) { digitalWrite(Relay1, LOW); } //И конец) delay(250); lcd.clear(); }
Разумеется в коде есть лишнии строки(их можно смело удалять)
Сам я в программировании не силён, поэтому решил обратиться за помощью.
За существенную помощь полагается вознаграждение)
Добрые люди, помогите пожалуйста дописать и довести до ума скетч.
Правильное решение - это обратится к СОЗДАТЕЛЮ программы. ОН знает про неё всё.
Думаю он не согласиться помогать, тем-более программа написана давно.
Puvli, программа написана очень криво. К слову сказать, она очень быстро убьет EEPROM.
В общем, по-хорошему, ее надо переписывать с нуля. Так что могу порекомендовать на выбор:
- обратиться в раздел "Ищу исполнителя", где Вам за приемлемую цену напишут вполне вменяемую программу,
- отложить эту программу в сторону и учиться программировать на примерах попроще. А когда что-то начнет получаться - вернуться к этой программе.
Думаю он не согласиться помогать, тем-более программа написана давно.
Соглашусь - написано коряво и СОЗДАТЕЛЬ скорее всего отказался от этого. Проще написать по-новой, чем доделывать этого зомби. Здесь, на форуме, есть куча вариантов меню.
Как думаете сколько будет стоить чтобы на заказ написали скетч для устройства автоматической подачи звонков?
К слову сказать, она очень быстро убьет EEPROM.
И это тоже.
Как думаете сколько будет стоить чтобы на заказ написали скетч для устройства автоматической подачи звонков?
Так обратитесь. А там Бармалей подкатит... Задача простая. Для специалиста ;)
Дело в том что я уже обращался. и отдал 5к за код (2800строк ) который мне пришлось немного переделывать чтобы он хотя бы запустился. Но меня считай кинули и сделали не то что я просил
5000 за 2800 строк - это как стоимость работы машинистки. 1.8р/строка... Наврядли тут было время для отладки и переговоров.
Наверное много требований было к прошивке?
Puvli, надеюсь это не программа подачи звонко была... А то 2800 строк - это примерно на порядок больше, чем нужно.
По сути вопроса - года два назад я уже помогал писать подобное - расписание звонков, разные дни... и выкладывал на форум, поищите.
Дело в том что я уже обращался. и отдал 5к за код (2800строк ) который мне пришлось немного переделывать чтобы он хотя бы запустился. Но меня считай кинули и сделали не то что я просил
Вас нае... Бали. Посмотрите на форуме. Тут народ БЕСПЛАТНО выкладывает охрененные вещи.
ищи информацию по запросу недельный таймер нa atmega. такого даже тут на форуме много, но а в гугле пруд пруди.
Вас нае... Бали. Посмотрите на форуме. Тут народ БЕСПЛАТНО выкладывает охрененные вещи.
Почему ? Вряд ли это о коде для звонков. Народ бесплатно выкладывает то, что было интересно ему самому, а на заказ совсем другое дело, 5k за 2800 строк это же недорого.
5k за 2800 строк это же недорого.
это практически задаром