Автоматическая подача звоков

Puvli
Offline
Зарегистрирован: 28.05.2022

Добрые люди, помогите пожалуйста дописать и довести до ума скетч.
Необходимо добавить расписание по которому будут включаться реле.
В коде используется таймер(который не работает) хотелось бы чтобы тип расписания звонков менялся путём нажатия на одну кнопку и выводилась информация о типе расписания(всего их 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
Offline
Зарегистрирован: 28.05.2022

Разумеется в коде есть лишнии строки(их можно смело удалять)

Сам я в программировании не силён, поэтому решил обратиться за помощью.

За существенную помощь полагается вознаграждение)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Puvli пишет:

Добрые люди, помогите пожалуйста дописать и довести до ума скетч.

Правильное решение - это обратится к СОЗДАТЕЛЮ программы. ОН знает про неё всё.

Puvli
Offline
Зарегистрирован: 28.05.2022

Думаю он не согласиться помогать, тем-более программа написана давно.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Puvli, программа написана очень криво. К слову сказать, она очень быстро убьет EEPROM.

В общем, по-хорошему, ее надо переписывать с нуля. Так что могу порекомендовать на выбор:

- обратиться в раздел "Ищу исполнителя", где Вам за приемлемую цену напишут вполне вменяемую программу,

- отложить эту программу в сторону и учиться программировать на примерах попроще. А когда что-то начнет получаться - вернуться к этой программе.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Puvli пишет:

Думаю он не согласиться помогать, тем-более программа написана давно.

Соглашусь - написано коряво и СОЗДАТЕЛЬ скорее всего отказался от этого. Проще написать по-новой, чем доделывать этого зомби. Здесь, на форуме, есть куча вариантов меню.

Puvli
Offline
Зарегистрирован: 28.05.2022

Как думаете сколько будет стоить чтобы на заказ написали скетч для устройства автоматической подачи звонков?

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

 К слову сказать, она очень быстро убьет EEPROM.

И это тоже.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Puvli пишет:

Как думаете сколько будет стоить чтобы на заказ написали скетч для устройства автоматической подачи звонков?

Так обратитесь. А там Бармалей подкатит... Задача простая. Для специалиста ;)

Puvli
Offline
Зарегистрирован: 28.05.2022

Дело в том что я уже обращался. и отдал 5к за код (2800строк ) который мне пришлось немного переделывать чтобы он хотя бы запустился. Но меня считай кинули и сделали не то что я просил

sadman41
Offline
Зарегистрирован: 19.10.2016

5000 за 2800 строк - это как стоимость работы машинистки. 1.8р/строка... Наврядли тут было время для отладки и переговоров.
Наверное много требований было к прошивке?

b707
Offline
Зарегистрирован: 26.05.2017

Puvli, надеюсь это не программа подачи звонко была... А то 2800 строк - это примерно на порядок больше, чем нужно.
По сути вопроса - года два назад я уже помогал писать подобное - расписание звонков, разные дни... и выкладывал на форум, поищите.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Puvli пишет:

Дело в том что я уже обращался. и отдал 5к за код (2800строк ) который мне пришлось немного переделывать чтобы он хотя бы запустился. Но меня считай кинули и сделали не то что я просил

Вас нае... Бали. Посмотрите на форуме. Тут народ БЕСПЛАТНО выкладывает охрененные вещи. 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

ищи информацию по запросу недельный таймер нa atmega. такого даже тут на форуме много, но а в гугле пруд пруди.

Morroc
Offline
Зарегистрирован: 24.10.2016

mykaida пишет:

Вас нае... Бали. Посмотрите на форуме. Тут народ БЕСПЛАТНО выкладывает охрененные вещи. 

Почему ? Вряд ли это о коде для звонков. Народ бесплатно выкладывает то, что было интересно ему самому, а на заказ совсем другое дело, 5k за 2800 строк это же недорого.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Morroc пишет:

 5k за 2800 строк это же недорого.

это практически задаром