// проект AMF
/*
int Fun_state (int var1, int var2, int var3) {
int var4;
if (var1 == HIGH && var2 == HIGH) {
var4 = 1;
}
else if (var1 == HIGH && var2 == LOW) {
var4 = 2;
}
else if (var1 == LOW && var2 == HIGH) {
var4 = 3;
}
else if (var1 == LOW && var2 == LOW && var3 == HIGH) {
var4 = 4;
}
else var4 = 5;
return var4;
}
//#define INPUTS 3
//#define OUTPUTS 4
//#define MY_PERIOD 500 // период в мс
//bool flag;
uint32_t tmr1, tmr2, tmr3, tmr4, tmr5, tmr6, tmr7, tmr8; // переменная таймера
#define TIMER_INPUT 500
#define TIMER_MAINS1 1500
#define TIMER_MAINS2 1500
#define TIMER_CUOPLING 1000
#define TIMER_GEN 1000
#define PERIOD1 300
//byte pins [] {
//27, //mains1,
//26,
//19,
//32,
//33,
//25,
//23,
//255,
//};
//enum {
//mains1,
//mains2,
//generator,
//Mains_br_1,
//Mains_br_2,
//Coupling,
//genBr
//};
#define MAINS1 27 // напряжение из города 1
#define MAINS2 26 // напряжение из города 2
#define GENERATOR 19 //напряжение на ген
#define MAINS_BR_1 32 // контактор город 1
#define MAINS_BR_2 33 // контактор город 2
#define COUPLING 25 // контактор секционник
#define GEN_BR 23 // контактор ген
// задаю переменные
int gen = 0; //отображает работу генератора
int main1 = 0; //отображает наличие напряжения город 1
int main2 = 0; //отображает наличие напряжения город 2
int stat = 0; //отображает state
void setup() {
//for (int i = 0; i < INPUTS; i++) {
// pinMode(pins[mains1 + i], INPUT_PULLUP);
// pinMode(pins[Mains_br_1 + i], OUTPUT);
// digitalWrite(pins[Mains_br_1 + i], LOW);
//}
pinMode(MAINS_BR_1, OUTPUT); // устанавливает режим работы - выход
pinMode(MAINS_BR_2, OUTPUT); // устанавливает режим работы - выход
pinMode(COUPLING, OUTPUT); // устанавливает режим работы - выход
pinMode(GEN_BR, OUTPUT); // устанавливает режим работы - выход
pinMode(MAINS1, INPUT_PULLUP); // назначаем входом напряжение из города 1
pinMode(MAINS2, INPUT_PULLUP); // назначаем входом напряжение из города 2
pinMode(GENERATOR, INPUT_PULLUP); // назначаем the_voltage входом напряжение с ген
digitalWrite(GEN_BR, LOW);
digitalWrite(COUPLING, LOW);
digitalWrite(MAINS_BR_1, LOW);
digitalWrite(MAINS_BR_2, LOW);
Serial.begin(9600); // установка связи по serial
}
void loop()
{
if (millis() - tmr6 >= TIMER_INPUT) { // ищем разницу
tmr6 = millis();
main1 = digitalRead(MAINS1);
Serial.print("Main 1 - ");
Serial.print(main1);
Serial.println();
}
if (millis() - tmr7 >= TIMER_INPUT) { // ищем разницу
tmr7 = millis();
main2 = digitalRead(MAINS2);
Serial.print("Main 2 - ");
Serial.print(main2);
Serial.println();
}
if (millis() - tmr8 >= TIMER_INPUT) { // ищем разницу
tmr8 = millis();
gen = digitalRead(GENERATOR);
Serial.print("Gener - ");
Serial.print(gen);
Serial.println();
}
stat = Fun_state(main1, main2, gen);
//Serial.print("State - ");
//Serial.println(stat);
if (stat == 1) {
if (millis() - tmr5 >= PERIOD1) { // ищем разницу
tmr5 = millis();
Serial.print("State 1 - ACTIVE ");
Serial.println(stat);
//delay (100);
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr3 >= TIMER_CUOPLING) { // ищем разницу
tmr3 = millis(); // сброс таймера
digitalWrite(COUPLING, LOW);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr4 >= TIMER_GEN) { // ищем разницу
tmr4 = millis(); // сброс таймера
digitalWrite(GEN_BR, LOW);// выполнить действие// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr1 >= TIMER_MAINS1) { // ищем разницу
tmr1 = millis(); // сброс таймера
digitalWrite(MAINS_BR_1, HIGH);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr2 >= TIMER_MAINS2) { // ищем разницу
tmr2 = millis(); // сброс таймера
digitalWrite(MAINS_BR_2, HIGH);// выполнить действие
}
//if (flag && millis() - tmr1 >= MY_PERIOD) {
//flag = 0; // сброс таймера
//digitalWrite(genBr, LOW);// выполнить действие
// }
//flag = !flag;
//tmr1 = millis();
//stat = 0;
}
}
else if (stat == 2) {
if (millis() - tmr5 >= PERIOD1) { // ищем разницу
tmr5 = millis(); // сброс таймера
Serial.print("State 2 - ACTIVE ");
Serial.println(stat);
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr4 >= TIMER_GEN) { // ищем разницу
tmr4 = millis(); // сброс таймера
digitalWrite(GEN_BR, LOW);// выполнить действие// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr2 >= TIMER_MAINS2) { // ищем разницу
tmr2 = millis(); // сброс таймера
digitalWrite(MAINS_BR_2, LOW);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr1 >= TIMER_MAINS1) { // ищем разницу
tmr1 = millis(); // сброс таймера
digitalWrite(MAINS_BR_1, HIGH);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr3 >= TIMER_CUOPLING) { // ищем разницу
tmr3 = millis(); // сброс таймера
digitalWrite(COUPLING, HIGH);// выполнить действие
}
//if (flag && millis() - tmr1 >= MY_PERIOD) {
//flag = 0; // сброс таймера
//digitalWrite(genBr, LOW);// выполнить действие
// }
//flag = !flag;
//tmr1 = millis();
//stat = 0;
}
}
else if (stat == 3) {
if (millis() - tmr5 >= PERIOD1) { // ищем разницу
tmr5 = millis(); // сброс таймера
Serial.print("State 3 - ACTIVE ");
Serial.println(stat);
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr4 >= TIMER_GEN) { // ищем разницу
tmr4 = millis(); // сброс таймера
digitalWrite(GEN_BR, LOW);// выполнить действие// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr1 >= TIMER_MAINS1) { // ищем разницу
tmr1 = millis(); // сброс таймера
digitalWrite(MAINS_BR_1, LOW);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr2 >= TIMER_MAINS2) { // ищем разницу
tmr2 = millis(); // сброс таймера
digitalWrite(MAINS_BR_2, HIGH);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr3 >= TIMER_CUOPLING) { // ищем разницу
tmr3 = millis(); // сброс таймера
digitalWrite(COUPLING, HIGH);// выполнить действие
}
//if (flag && millis() - tmr1 >= MY_PERIOD) {
//flag = 0; // сброс таймера
//digitalWrite(genBr, LOW);// выполнить действие
// }
//flag = !flag;
//tmr1 = millis();
//stat = 0;
}
}
else if (stat == 4) {
if (millis() - tmr5 >= PERIOD1) { // ищем разницу
tmr5 = millis(); // сброс таймера
Serial.print("State 4 - ACTIVE ");
Serial.println(stat);
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr1 >= TIMER_MAINS1) { // ищем разницу
tmr1 = millis(); // сброс таймера
digitalWrite(MAINS_BR_1, LOW);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr2 >= TIMER_MAINS2) { // ищем разницу
tmr2 = millis(); // сброс таймера
digitalWrite(MAINS_BR_2, LOW);// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr4 >= TIMER_GEN) { // ищем разницу
tmr4 = millis(); // сброс таймера
digitalWrite(GEN_BR, HIGH);// выполнить действие// выполнить действие
}
//flag = !flag;
// tmr1 = millis();
if (millis() - tmr3 >= TIMER_CUOPLING) { // ищем разницу
tmr3 = millis(); // сброс таймера
digitalWrite(COUPLING, HIGH);// выполнить действие
}
//if (flag && millis() - tmr1 >= MY_PERIOD) {
//flag = 0; // сброс таймера
//digitalWrite(genBr, LOW);// выполнить действие
// }
//flag = !flag;
//tmr1 = millis();
//stat = 0;
}
}
else {
Serial.println("State 5 - ACTIVE " + stat);
//Serial.println();
//flag = !flag;
// tmr1 = millis();
//if (millis() - tmr1 >= TIMER_MAINS1) { // ищем разницу
//tmr1 = millis(); // сброс таймера
digitalWrite(MAINS_BR_1, LOW);// выполнить действие
//}
//flag = !flag;
// tmr1 = millis();
//if (millis() - tmr2 >= TIMER_MAINS1) { // ищем разницу
//tmr2 = millis(); // сброс таймера
digitalWrite(MAINS_BR_2, LOW);// выполнить действие
//}
//flag = !flag;
// tmr1 = millis();
//if (millis() - tmr3 >= TIMER_CUOPLING) { // ищем разницу
//tmr3 = millis(); // сброс таймера
digitalWrite(COUPLING, LOW);// выполнить действие
//}
//flag = !flag;
// tmr1 = millis();
//if (millis() - tmr4 >= TIMER_GEN) { // ищем разницу
//tmr4 = millis(); // сброс таймера
digitalWrite(GEN_BR, LOW);// выполнить действие// выполнить действие
//}
//if (flag && millis() - tmr1 >= MY_PERIOD) {
//flag = 0; // сброс таймера
//digitalWrite(genBr, LOW);// выполнить действие
// }
//flag = !flag;
//tmr1 = millis();
//stat = 0;
}
stat = 5;
}
*/
// Подключаем библиотеку для работы с дисплеем
//#include <QuadDisplay2.h>
// создаём объект класса QuadDisplay и передаём номер пина CS
//QuadDisplay qd(10);
// создаем объекты класса bute для хранения текущего значения Часов, Минут, Секунд
//int hours = 9;
//int minutes = 8;
//int seconds = 0;
//#define RELAY 25
// создаем объект класса long для хранения счетчика
//long lastTime = 0;
//void setup() {
// инициализация дисплея
//qd.begin();
// инициализируем время
//setTime(__TIMESTAMP__);
//uint32_t sec = millis() / 1000ul; // полное количество секунд
//int timeHours = (sec / 3600ul); // часы
//int timeMins = (sec % 3600ul) / 60ul; // минуты
//int timeSecs = (sec % 3600ul) % 60ul; // секунды
//Serial.begin(9600);
//}
//void loop() {
// как только разница между текущим временем и временем записанным в lastTime становится больше 1000 миллисекунд...
/*while(millis()-lastTime > 1000) {
//...обновляем lastTime и добавляем к счетчику Секунд +1
lastTime = millis();
seconds++;
// как только счетчик секунд достигнет 60, обнуляем его и добавляем к счетчику Минут +1...
if (seconds >= 60) {
seconds = 0;
minutes++;
}
// ...тоже самое для Часов...
if (minutes >= 60) {
minutes = 0;
hours++;
}
// ... и обнуляем счетчик Часов в конце дня
if (hours >= 24) {
hours = 0;
}
}
*/
/*
// выводим время на дисплей
//qd.displayScore(hours, minutes, true);
uint32_t sec = millis() / 1000ul; // полное количество секунд
hours = (sec / 3600ul); // часы
minutes = (sec % 3600ul) / 60ul; // минуты
seconds = (sec % 3600ul) % 60ul; // секунды
if (hours >= 0 && hours < 10) {
Serial.print("0");
Serial.print (hours);
}
else Serial.print (hours);
Serial.print (":");
if (minutes >= 0 && minutes < 10) {
Serial.print("0");
Serial.print (minutes);
}
else Serial.print (minutes);
Serial.print (":");
if (seconds >= 0 && seconds < 10) {
Serial.print("0");
Serial.print (seconds);
}
else Serial.print(seconds);
Serial.println ();
}
//функция записи текущего времени в переменные
void setTime(const char* compileTimeStamp)
{
hours = ((compileTimeStamp[11] - '0') * 10
+ (compileTimeStamp[12] - '0'));
minutes = ((compileTimeStamp[14] - '0') * 10
+ (compileTimeStamp[15] - '0'));
seconds = ((compileTimeStamp[17] - '0') * 10
+ (compileTimeStamp[18] - '0'));
}
*/
/*
// Данный код выполняет действие с периодом PERIOD на время WORK_TIME, эдакий свернизкочастотный ШИМ
// Банально автополив
// Нам нужно задать период таймера В МИЛЛИСЕКУНДАХ
// дней*(24 часов в сутках)*(60 минут в часе)*(60 секунд в минуте)*(1000 миллисекунд в секунде)
// (long) обязательно для больших чисел, иначе не посчитает
// можно посчитать на калькуляторе, но какбэ ардуино и есть калькулятор, пусть считает...
//unsigned long period_time = (long)5*24*60*60*1000;
unsigned long period_time = (long)1*60*1000;
unsigned long work_time = 10000; // время, на которое ну скажем включится лампочка
#define TIMER_START 0 // 1 - отсчёт периода с момента ВЫКЛЮЧЕНИЯ лампочки, 0 - с ВКЛЮЧЕНИЯ
// переменная таймера, максимально большой целочисленный тип (он же uint32_t)
unsigned long period_timer, work_timer;
boolean work_flag;
int hours;
int minutes;
int seconds;
#define RELAY 25
void setup() {
Serial.begin(9600);
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
period_timer = millis();
}
void loop() {
uint32_t sec = millis() / 1000ul; // полное количество секунд
hours = (sec / 3600ul); // часы
minutes = (sec % 3600ul) / 60ul; // минуты
seconds = (sec % 3600ul) % 60ul; // секунды
if (hours >= 0 && hours < 10) {
Serial.print("0");
Serial.print (hours);
}
else Serial.print (hours);
Serial.print (":");
if (minutes >= 0 && minutes < 10) {
Serial.print("0");
Serial.print (minutes);
}
else Serial.print (minutes);
Serial.print (":");
if (seconds >= 0 && seconds < 10) {
Serial.print("0");
Serial.print (seconds);
}
else Serial.print(seconds);
Serial.println ();
if ((long)millis() - period_timer > period_time) {
period_timer = millis(); // "сбросить" таймер периода
work_timer = millis(); // сбросить таймер выполнения
work_flag = true; // начали выполнение
digitalWrite(RELAY, HIGH);
// включить лампу, помпу, реле, что угодно
// банально digitalWrite(пин, HIGH)
}
if ( ((long)millis() - work_timer > work_time) && work_flag) {
// сброс флага на выполнение
// можно сбросить таймер периода ПОСЛЕ выполнения задачи. Подумайте над этим!
if (TIMER_START) period_timer = millis(); {
digitalWrite(RELAY, LOW);
}
work_flag = false;
// выключить лампу, помпу, реле, что угодно
// банально digitalWrite(пин, LOW)
}
if (work_flag) {
// а вот этот блок кода выполняется всегда, пока мы находимся по времени "внутри" WORK_TIME
}
}
*/
/*
Тестирование производилось на Arduino IDE 1.6.12
Дата тестирования 23.11.2016г.
*/
/*
//Подключаем библиотеки
//#include <WProgram.h>
#include <Wire.h>
//#include <DS1307RTC.h>
//#include <RTClib.h>
//#include <TimeLib.h>
#include <LiquidCrystal.h>
//Выводы дисплея
LiquidCrystal lcd(25, 26, 27, 32, 33, 23);
//Инициализация
void setup(){
lcd.begin(16, 2); //Дисплей 16Х2
lcd.setCursor(3, 0); //Установить 3 символ 0 строки
lcd.print("ARDUINO-RTC"); // выводим надпись завтавки ARDUINO-RTC
lcd.setCursor(5, 1); //Установить 5 символ 1 строки
lcd.print("DS-1307"); // выводим надпись завтавки DS-1307
delay(5000); // удерживаем заставку 5 секунд
lcd.clear(); // Очищаем дисплей
// Тут выставляем время внутри DS1307, первый раз разкоментируем, выставляем время
// а после коментим опять и часы идут уже внутри DS1307, пока батарейку не выдернем с нее
// после того как прошили время опять каментим данный код и прошиваем еще раз
// чтоб выключить режим програмирования ds1307
//RTC.stop();
//RTC.set(DS1307_SEC,50); //Установить секунды
//RTC.set(DS1307_MIN,18); //Установить минуты
//RTC.set(DS1307_HR,02); //Установить часы
//RTC.set(DS1307_DOW,07); //Установить день недели
//RTC.set(DS1307_DATE,22); //Установить дату
//RTC.set(DS1307_MTH,04); //Установить месяц
//RTC.set(DS1307_YR,12); //Установить год
//RTC.start();
}
void loop()
{
lcd.setCursor(0, 0);
//lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
lcd.print(":");
//lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
lcd.print(":");
//lcd.print(RTC.get(DS1307_SEC,false));//read seconds
lcd.print(" "); // some space for a more happy life
lcd.setCursor(0, 1);
//lcd.print(RTC.get(DS1307_DATE,false));//read date
lcd.print("/");
//lcd.print(RTC.get(DS1307_MTH,false));//read month
lcd.print("/");
//lcd.print(RTC.get(DS1307_YR,false)); //read year
lcd.print(" Day-");
//lcd.print(RTC.get(DS1307_DOW,false));
}
*/
#include "RTClib.h"
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(25, 26, 27, 32, 33, 23);
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
lcd.begin(16, 2); //Дисплей 16Х2
lcd.setCursor(3, 0); //Установить 3 символ 0 строки
lcd.print("ARDUINO-RTC"); // выводим надпись завтавки ARDUINO-RTC
lcd.setCursor(5, 1); //Установить 5 символ 1 строки
lcd.print("DS-1307"); // выводим надпись завтавки DS-1307
delay(5000); // удерживаем заставку 5 секунд
lcd.clear(); // Очищаем дисплей
}
}
void loop () {
DateTime now = rtc.now();
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println();
delay(3000);
lcd.setCursor(0, 0);
lcd.print(now.hour()); //read the hour and also update all the values by pushing in true
lcd.print(":");
lcd.print(now.minute());//read minutes without update (false)
lcd.print(":");
lcd.print(now.second());//read seconds
//lcd.print(" "); // some space for a more happy life
delay(2000);
lcd.setCursor(3, 1);
lcd.print(now.day());//read date
lcd.print("/");
lcd.print(now.month());//read month
lcd.print("/");
lcd.print(now.year()); //read year
//lcd.print(" Day-");
//lcd.print(RTC.get(DS1307_DOW,false));
}