Автоматическая подача звоков
- Войдите на сайт для отправки комментариев
Сб, 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 строк это же недорого.
это практически задаром