Как запустить два реле в разные дни и часы - ФОРУМ ДВ Робот dvrobot.ru
Четверг, 24.05.2018, 23:28
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: Serg, GRACH  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Как запустить два реле в разные дни и часы (Готовая конструкция будет работать автономно, в лесу ...)
    Как запустить два реле в разные дни и часы
    arthurilyutsДата: Среда, 18.09.2013, 09:12 | Сообщение # 1
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Люди добрые, помогите с кодом (Sketch).
    Понимаю, что что-то не хватает, а где найти не знаю.
    В общем, нужно что бы запустить два реле в разные дни и часы.
    К примеру:

    Дата: 12.10.2013
    Время: 12:10
    Реле №1: Включено
    Через 2 секунды Реле №1: Выключено

    Дата: 12.10.2013
    Время: 12:20
    Реле №2: Включено
    Через 2 секунды Реле №2: Выключено

    Дата: 13.10.2013
    Время: 13:10
    Реле №1: Включено
    Через 2 секунды Реле №1: Выключено

    Дата: 13.10.2013
    Время: 13:20
    Реле №2: Включено
    Через 2 секунды Реле №2: Выключено
    (Кстати, как прописать не 2 секунды, а 2 минуты?)

    и т.д.
    Нужно расписать календарь, ну хотя бы на месяц а то и больше. Оба Реле будут срабатывать каждый день, НО в разные часы и минуты.
    Помогите, кто разбирается как правильно дописать этот код (Sketch).

    Да, еше вопрос. Нужно ли сюда (Arduino + 2 Chanel Relay Modul) подключать модульRTC (real-time clock), ну для точного времени?
    (В гугле видел такую картинку http://www.lucadentella.it/blog/wp-content/uploads/2013/04/timer_wiring.jpg)
    Готовая конструкция будет работать автономно, в лесу и желательно, что бы она срабатывала точно по времени.
    Заранее всем спасибо!!!

    Код
    Код
    #define RELAY1 6
    #define RELAY2 7

    void setup()
    {
    pinMode(RELAY1, OUTPUT);
    pinMode(RELAY2, OUTPUT);

    DATE(1) 12.10.2013
    TIME(1)  12:10
    DATE(2) 12.10.2013
    TIME(2) 12:20

    }
    void loop()

    if (DATE(1) == 12.10.2013 && TIME(1) == 12:10)

    {
    digitalWrite(RELAY1,LOW); // Turns ON Relays 1
    delay(2000); // Wait 2 seconds
    digitalWrite(RELAY1,HIGH); // Turns Relay Off
    }

    if (DATE(2) == 12.10.2013 && TIME(2) == 12:20)

    {
    digitalWrite(RELAY2,LOW); // Turns ON Relays 2
    delay(2000); // Wait 2 seconds
    digitalWrite(RELAY2,HIGH); // Turns Relay Off
    }


    Сообщение отредактировал arthurilyuts - Среда, 18.09.2013, 10:02
     
    SergДата: Среда, 18.09.2013, 11:02 | Сообщение # 2
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Вы пытаетесь изобрести велосипед:-) . Поищите в Гугле " месячный таймер" и найдете сотни и тысячи готовых решений. Кстати, как обеспечите в лесу бесперебойное питание таймера в течении месяцев?
     
    arthurilyutsДата: Четверг, 19.09.2013, 05:41 | Сообщение # 3
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Уважаемый "Serg", я допускаю, что у меня руки не от-туда растут и именно по этому я ни как не могу найти ни в Гугле ни гдебы-то еще этот так называемый "месячный таймер".
    Может вы поможете и конкретно ссылку дадите?
    А еще лучше, конечно если бы Вы или кто-то еще помог дописать этот код, непосредственно для выполнения выше описанной мною задачей.
    Буду очень признателен!!!!
    Дело еще в том, что даже если я каким-то чудом и наткнусь на издали похожий пример, то мне все равно не хватит знаний как выбрать именно то, что мне нужно.
    Ну а на счет бесперебойного питания, так ведь есть аккумуляторы различные. Для устройства, которое будет запускаться раз в день на 5-10 минут, небольшой аккумулятор и на больший срок потянет.
     
    loriДата: Среда, 25.09.2013, 17:54 | Сообщение # 4
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Если вы хотите решить вашу задачу при помощи Arduino, то вам понадобится сам контроллер Arduino UNO R3 (ID:230-5), Реле Щит 1.0 (ID:571-59), Часы DS3231 (ID:547-27). В скобках указаны идентификационный номер для заказа на сайте DVROBOT. Это все нужно будет приобрести как минимум. Кроме того вам будет необходим надежный источник питания, его тоже можно найти на этом сайте, этот источник будет питать вашу схему. Но на сколько я понимаю ваша схема через реле будет управлять какими то исполнительными механизмами, значит и для этих устройств необходимо будет подобрать свое питание. Как все это собрать чтобы работало я вам смогу помочь, и Sketch написать помогу. Если готовы к работе пишите.
     
    arthurilyutsДата: Суббота, 12.10.2013, 10:07 | Сообщение # 5
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Спасибо "lori" за надежду!
    Итак:
    Вся это конструкция будет контролировать рацию у которой свое независимое питание!
    Реле-1 включать и выключать питание рации, а Реле-2 будет нажимать кнопку на передачу.

    Не пинайте сильно, но нужно примерно такое:
    ----------------------------------------------------------------------------
    X = Variable Dates (допустим переменные которые будут записаны как математическое число, а не как дата)

    X = 131011123020 (Например: 13=год 10=месец 11=день 12=час 30=минута 20=секунда, на система прочитает это как 131 миллиард, 011 миллионов, 123 тысячи, 020.)
    X = 131012123130
    X = 131013123645

    Y = RealTimeClock (тут также нужно прописать время с RTC, как математическое число, а не как дата в той же последовательности, что и выше: год,мес,день,час,мин,сек.)

    (осталось запустить сам процесс)

    if Y = X then

    Relay_1 On
    Delay 2000 (2 секунды кнопка ВКЛ/ВЫКЛ зажата и рация включается)
    Relay_1 Off

    Delay 5000 (еще через 5 секунд)

    Relay_2 On (зажимаем кнопку на передачу)
    Delay 5000
    Relay_2 Off (рация отработала 5 секунд и теперь кнопка передачи отпускается)

    Delay 5000 (еще через 5 секунд)

    Relay_1 On
    Delay 2000 (2 секунды кнопка ВКЛ/ВЫКЛ зажата и рация теперь выключается)
    Relay_1 Off

    end if

    Если все будет работать по выше описанной мной логике, то я смогу прописывать большое количество дат и времени для срабатывания реле.
    ---------------------------------------

    Все нужные железки купить смогу только не в Росии, а в Турции так как там живу .
    Ну а вот написать сам Sketch не умею пока.
    Вот по этому и очень нуждаюсь в помощи со стороны.
    Даже готов как-то материально/финансово отблагодарить.

    Еще раз спасибо за помощь!!!
     
    loriДата: Суббота, 12.10.2013, 10:56 | Сообщение # 6
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Я не очень понимаю для чего хранить такое длинное число? Дело в том что ардуинке будет сложно обрабатывать и хранить такие большие числа. Может все же как то попроще?
     
    arthurilyutsДата: Суббота, 12.10.2013, 19:29 | Сообщение # 7
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Цитата
    Может все же как то попроще?

    Можно и попроще, но КАК например?
     
    loriДата: Суббота, 12.10.2013, 19:59 | Сообщение # 8
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    Разделить число, месяц, год, часы, минуты, секунды на разные переменные и контролировать наступление определенного момента (запрограммированного пользователем) запускать нужные функции при этом.
     
    arthurilyutsДата: Вторник, 15.10.2013, 00:51 | Сообщение # 9
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Так ведь разве не легче контролировать одно число, пусть даже и 12-ти значное, ну или скажем откажемся от года, месяца и даже секунд, оставив день, час и минуты, так как фактически только они и нужны. Вот, теперь мы имеем 6-ти значное число. Разве его не проще контролировать, чем разбивать на части и контролировать их все по отдельности?
    Может я и правда глуплю, но мне кажется это легче.

    А можите написать конкретный Sketch?
    Что-бы мне пойти купить все необходимое железо и просто записать в него Ваш Sketch!
    Буду очень-очень-очень-очень признателен и благодарен и как я уже писал выше, что готов даже рассмотреть вопрос о вознаграждении.

    Думаю, что где-то вот в таком ключе все должно быть.
    Не совсем понимаю, как прописать переменные "AlarmTime", а прописать их нужно на 30 дней.

    Ну кто нибудь, помогите пожалуйста, уже все мозги вскипели.

    Код


    int RealTime =  RTC.get(DS1307_DAY,true) && RTC.get(DS1307_HR,true) && RTC.get(DS1307_MIN,true)
    int Roley_1 = 8;
    int Roley_2 = 9;
    int AlarmTime = 121310  // 12 13 10 = day, hour, minutes

    void setup ()
    {
    pinMode (Roley_1, OUTPUT);
    pinMode (Roley_2, OUTPUT);
    }
    void loop ()
    {
    if (digitalRead(RealTime) == AlarmTime)
    {
    digitalWrite(Roley_1, HIGH); // Roley_1 On
    delay(2000); // wait for 2 seconds
    digitalWrite(Roley_1, LOW); // Roley_1 Off
    delay(5000);
    digitalWrite(Roley_2, HIGH);
    delay(50000);
    digitalWrite(Roley_2, LOW);
    delay(5000);
    digitalWrite(Roley_1, HIGH);
    delay(2000);
    digitalWrite(Roley_1, LOW);
    }
    }


    Сообщение отредактировал arthurilyuts - Вторник, 15.10.2013, 01:35
     
    loriДата: Понедельник, 28.10.2013, 07:56 | Сообщение # 10
    12 Вольт
    Группа: Пользователи
    Сообщений: 108
    Репутация: 20
    Статус: Offline
    На этом сайте появилась ссылка на графическую среду программирования ардуино, очень просто для начинающих. Вот ссылка:

    http://forumdvrobot.ru/forum/2-93-1
     
    arthurilyutsДата: Среда, 30.10.2013, 06:26 | Сообщение # 11
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Спасибо lori, но это не совсем то что мне нужно.

    А как на счет скетча, что так и некому не по зубам, что-ли?
    Или не осталось на свете добрых людей, готовых помочь незнающим?
    Жаль! А я было понадеялся. sad
    Ну, что-же, пойду искать дальше.
     
    Ivan-771Дата: Среда, 30.10.2013, 11:56 | Сообщение # 12
    5 Вольт
    Группа: Пользователи
    Сообщений: 39
    Репутация: 0
    Статус: Offline
    Время — самый ценный и невосполнимый ресурс, поэтому расходуют, его мудро!
     
    SergДата: Среда, 30.10.2013, 19:03 | Сообщение # 13
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Цитата arthurilyuts ()
    и т.д.
     Сформулируйте конкретную задачу.
     
    arthurilyutsДата: Среда, 30.10.2013, 20:33 | Сообщение # 14
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Уважаемый Ivan-771, согласен с мыслью по поводу времени, однако полагаю, что для человека в теме это займет не более нескольких минут.

    Что косательно "сформулируйте конкретную задачу", так как можно сформулировать еще конкретнее, чем описано чуть выше? Ну может так; Нужно 2 реле, которые поочередно будут срабатывать раз в сутки и каждый раз в разное время. Время срабатывания нужно будет прописать минимум на месяц (идеально бы на год) вперед. Вот и все!
     
    SergДата: Среда, 30.10.2013, 21:23 | Сообщение # 15
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    ну Вы написали лишь на четверо суток.  А в остальные 361 суток какое время срабатывания?
     
    arthurilyutsДата: Среда, 30.10.2013, 21:36 | Сообщение # 16
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Serj, ну это же я только для примера, когда у меня будет готовый работающий 'скетч' я сам впушу туда нужные дни и часы срабатывания.
    Моя проблема в том, что я не совсем понимаю как получить данные с "rtc" и вписать 30 времен (на месяц) "day-hour-minute" срабатывания реле.

    Если я правильно понимаю, ардуино будет сопостовлять настоящее время с прописаными часами и если настоящее время совпадет с одним из прописанного, то запустин "loop" с реле. Реле поочередно включится/выключится И так до следуйщего времени срабатывания.

    Как то так!
     
    SergДата: Среда, 30.10.2013, 22:15 | Сообщение # 17
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Вы все правильно понимаете. Но есть один нюанс. Вот это время  срабатывания поддается какому алгоритму или каждый день оно выбирается методом тыка в небо?
    Просто писать 365 переменных в программе- это как то долго. Гораздо проще устанавливать новое время срабатывания путем некоторых манипуляций с предыдущим. DATA2=Data1+23 часа.
    А по поводу как получить время с часов- вот ссылка
     
    SergДата: Среда, 30.10.2013, 22:27 | Сообщение # 18
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Код
    #include <Wire.h>

    int clockAddress = 0x68;  // This is the I2C address
    int command = 0;  // This is the command char, in ascii form, sent from the serial port       
    long previousMillis = 0;  // will store last time Temp was updated
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    byte test;   

    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
        return ( (val/10*16) + (val%10) );
    }

    // Convert binary coded decimal to normal decimal numbers
    byte bcdToDec(byte val)
    {
        return ( (val/16*10) + (val%16) );
    }

    // 1) Sets the date and time on the ds1307
    // 2) Starts the clock
    // 3) Sets hour mode to 24 hour clock
    // Assumes you're passing in valid numbers,   
    // Probably need to put in checks for valid numbers.
    void setDateDs1307()                  
    {
        // Use of (byte) type casting and ascii math to achieve result.    
        second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48));   
        minute = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
        hour  = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
        dayOfWeek = (byte) (Serial.read() - 48);
        dayOfMonth = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
        month = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
        year= (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
        Wire.beginTransmission(clockAddress);
        Wire.write(byte(0x00));
        Wire.write(decToBcd(second));  // 0 to bit 7 starts the clock
        Wire.write(decToBcd(minute));
        Wire.write(decToBcd(hour));    // If you want 12 hour am/pm you need to set
        // bit 6 (also need to change readDateDs1307)
        Wire.write(decToBcd(dayOfWeek));
        Wire.write(decToBcd(dayOfMonth));
        Wire.write(decToBcd(month));
        Wire.write(decToBcd(year));
        Wire.endTransmission();
    }

    // Gets the date and time from the ds1307 and prints result
    void getDateDs1307() {
        // Reset the register pointer
        Wire.beginTransmission(clockAddress);
        Wire.write(byte(0x00));
        Wire.endTransmission();

        Wire.requestFrom(clockAddress, 7);

        // A few of these need masks because certain bits are control bits
        second     = bcdToDec(Wire.read() & 0x7f);
        minute     = bcdToDec(Wire.read());
          
        // Need to change this if 12 hour am/pm
        hour       = bcdToDec(Wire.read() & 0x3f);    
        dayOfWeek  = bcdToDec(Wire.read());
        dayOfMonth = bcdToDec(Wire.read());
        month      = bcdToDec(Wire.read());
        year       = bcdToDec(Wire.read());

        Serial.print(hour, DEC);
        Serial.print(":");
        Serial.print(minute, DEC);
        Serial.print(":");
        Serial.print(second, DEC);
        Serial.print("  ");
        Serial.print(month, DEC);
        Serial.print("/");
        Serial.print(dayOfMonth, DEC);
        Serial.print("/");
        Serial.print(year, DEC);

    }

    void setup() {
        Wire.begin();
        Serial.begin(57600);
    }

    void loop() {
        if (Serial.available()) {  // Look for char in serial que and process if found
          command = Serial.read();
          if (command == 84) {      //If command = "T" Set Date
            setDateDs1307();
            getDateDs1307();
            Serial.println(" ");
          }
          else if (command == 81) {  //If command = "Q" RTC1307 Memory Functions
            delay(100);       
            if (Serial.available()) {
              command = Serial.read();   
                
              // If command = "1" RTC1307 Initialize Memory - All Data will be set to 255 (0xff).    
              // Therefore 255 or 0 will be an invalid value.    
              if (command == 49) {   
                  
                // 255 will be the init value and 0 will be cosidered an error that   
                // occurs when the RTC is in Battery mode.   
                Wire.beginTransmission(clockAddress);
                  
                // Set the register pointer to be just past the date/time registers.
                Wire.write(byte(0x08));    
                for (int i = 1; i <= 27; i++) {
                  Wire.write(byte(0xff));
                  delay(100);
                }     
                Wire.endTransmission();
                getDateDs1307();
                Serial.println(": RTC1307 Initialized Memory");
              }
              else if (command == 50) {      //If command = "2" RTC1307 Memory Dump
                getDateDs1307();
                Serial.println(": RTC 1307 Dump Begin");
                Wire.beginTransmission(clockAddress);
                Wire.write(byte(0x00));
                Wire.endTransmission();
                Wire.requestFrom(clockAddress, 64);
                for (int i = 1; i <= 64; i++) {
                  test = Wire.read();
                  Serial.print(i);
                  Serial.print(":");
                  Serial.println(test, DEC);
                }
                Serial.println(" RTC1307 Dump end");
              }   
            }    
          }
          Serial.print("Command: ");
          Serial.println(command);  // Echo command CHAR in ascii that was sent
        }

        command = 0;  // reset command                    
        delay(100);
    }

    со строки 50 начинается функция считывания времени и вывод ее в последовательный порт.
     
    arthurilyutsДата: Среда, 30.10.2013, 22:28 | Сообщение # 19
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Время будет вписыватся методом "научного тыка в небо". По этому его не получится привязать к какой-то формуле для перерасчета. Мне нужно будет вписывать хотябы 30 "переменных" и раз в месяц менять эти "переменные" да и аккумуляторы наверное тоже.
    К стати, есть разница какой "RTC" покупать или под готовый скетч можно любой "RTC" цеплять?


    Сообщение отредактировал arthurilyuts - Среда, 30.10.2013, 22:36
     
    SergДата: Среда, 30.10.2013, 22:58 | Сообщение # 20
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Разницы нет, под другие часы ,возможно, придется поправить пару строк.
    Ну раз нет никакого алгоритма- возьмите из прикрепленного архива готовую программу будильника на Arduino и впишите туда 30 будильников.их 

    А зачем включать станцию каждый день один раз? Маяк какой-то?
    Прикрепления: Time-1-.zip(32.9 Kb)
     
    arthurilyutsДата: Среда, 30.10.2013, 23:18 | Сообщение # 21
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 10
    Репутация: 0
    Статус: Offline
    Serg, огромное СПАСИБО за дельные советы!!!
    Пологаю, что это именно то что нужно.
    Бегу покупать "RTC" модуль, а потом отпишусь.
    А на счет "Маяк какой-то?", да точно. Что-то типа него, принцип работы тот-же.
    Еще раз СПАСИБО!!!
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Как запустить два реле в разные дни и часы (Готовая конструкция будет работать автономно, в лесу ...)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат