HELP. Проект: "Безопасное ЗУ"

Тема в разделе "Arduino & Shields", создана пользователем Егор Сергеевич, 4 окт 2019.

  1. Доброго времени суток! Делаю устройство, которое будет заряжать различные устройства от сети 220в в безопасном режими. Суть такова: Есть ардуино уно, пару реле, ИК приемник и пульт, ЛСД дисплей. Через ардуино с помощью ИК пульта включаем реле на заданное программой время (в моем коде сейчас это 3 сек). Эту информацию транслируем на дисплей. Т.е. с пульта включили реле 1, на дисплее загорается "1-On" и оно должно проработать допустим 3 сек (затем поменяю на 1 час). А как сделать так, чтобы реле 1 работало допустим 3 сек или могло быть выключено с кнопки пульта? Сейчас я не могу отключить его пультом, так как в моем коде используется delay.

    Код (C++):
    #include <IRremote.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>


    LiquidCrystal_I2C lcd(0x27,16,2);
    IRrecv irrecv(11); //вывод, к которому подключен ИК приемник

    decode_results results;
    int Relay = 13;  //пин управляющего реле провода
    int Relay2 = 10;  // плюсовой пин управляемого светодиода

    void setup()
    {
    Serial.begin(9600);   // подключаем порт передачи данных в ПК
    pinMode(Relay, OUTPUT); // без этого слабых выход на указанный пин
    pinMode(Relay2, OUTPUT); // без этого слабых выход на указанный пин
    irrecv.enableIRIn(); // запускаем прием

    lcd.init();                      // Инициализация дисплея
    lcd.backlight();                 // Подключение подсветки
    lcd.setCursor(5,0);              // Установка курсора в начало первой строки
    lcd.print("1-Off");       // Набор текста на первой строке
    lcd.setCursor(5,1);              // Установка курсора в начало первой строки
    lcd.print("2-Off");       // Набор текста на первой строке

    }


    void loop() {
    if ( irrecv.decode( &results )) { // если данные пришли

    Serial.println(results.value, HEX);  // передача данных в порт
    irrecv.resume();   // передача данных в порт

    switch ( results.value )
    {
    case 0x2B:
    digitalWrite( Relay, HIGH ); //если значение кнопки выше, то включаем relay
    lcd.setCursor(5,0);              // Установка курсора в начало первой строки
    lcd.print("1-On ");       // Набор текста на первой строке
    delay (3000);  //ждем 3 секунды
    digitalWrite( Relay, LOW );  // отключаем
    lcd.setCursor(5,0);              // Установка курсора в начало первой строки
    lcd.print("1-Off");       // Набор текста на первой строке
    break;

    case 0x2C:
    digitalWrite( Relay, LOW );  //если значение кнопки выше, то выключаем relay
    lcd.setCursor(5,0);              // Установка курсора в начало первой строки
    lcd.print("1-Off");       // Набор текста на первой строке
    break;

    case 0x81D  :
    digitalWrite( Relay2, HIGH ); //если значение кнопки выше, то включаем
    lcd.setCursor(5,1);              // Установка курсора в начало первой строки
    lcd.print("2-On ");       // Набор текста на первой строке
    break;

    case 0x1C:
    digitalWrite( Relay2, LOW );  //если значение кнопки выше, то выключаем
    lcd.setCursor(5,1);              // Установка курсора в начало первой строки
    lcd.print("2-Off");       // Набор текста на первой строке
    break;

    }
    irrecv.resume(); // принимаем следующую команду
    }
    }
    Ардуино начал только изучать, знаний не хватает, в сети подобного не нашел.
     
  2. akl

    akl Гик

  3. Asper Daffy

    Asper Daffy Гуру

    На самом деле, ты не можешь по другой причине. Но даже если так - не можешь из-за делэя - так не используй его. Проблема-то в чём?
     
    DetSimen нравится это.
  4. Airbus

    Airbus Радиохулиган Модератор

    А зачем ждем 3 секунды?
     
  5. parovoZZ

    parovoZZ Гуру

    если 3 секунды будут успешными, то далее последует переключение на час!
     
  6. Airbus

    Airbus Радиохулиган Модератор

    В смысле если не йопнет?
     
  7. безопасное ЗУ, смысл в том, что реле будет активно (замкнуто) определенное количество времени - 1 час. Т.е. устройство, например телефон, стоит 1 час на зарядке, далее реле отключается и телефон снимается с заряда. Нам необходима эта идея. В стадии разработки вместо 1 часа, считаю целесообразным использовать 3 сек.
     
  8. спасибо, склонялся к этому. подумал что есть пути решения задачи проще чем этот, и написал здесь. буду изучать
     
  9. все вполне логично, были сомнения что использовать вместо дэлая
     
  10. parovoZZ

    parovoZZ Гуру

    а есть опасные ЗУ??? В телефонах ЗУ находится в самом телефоне, а чаще в батарее. Зачем ещё одна сущность?
     
  11. Тему я создал не для того чтобы выяснять актуальность проекта;)

    Помимо современных телефонов, которые, как правило, безопасны в процессе зарядки (тут ты прав), есть ещё куча всяких китайских устройств и не только, которые при зарядке нагреваются: АКБ вздуваются, а ещё хуже взрываются. Для избежания выше описанных случаев в общественном месте и нужен наш проект.
     
  12. Егор Сергеевич, т.е. за час зарядки аккумулятор не может вспухнуть и бабахнуть ?
     
  13. Может быть я не знаю всех тонкостей зарядки АКБ и не такой умный как вы в этом вопросе, но есть необходимость в таком устройстве. Есть опыт использования аналогичного устройства, и, как минимум, ни одной порчи АКБ в нем не произошло. Может быть это совпадение, а может действительно есть польза от отключения ЗУ от сети, через определенное время. Уважаемый, повторюсь вновь: тема создана не для выяснения актуальности проекта.

    Если вы хотите рассказать мне подробнее о том, как заряжаются АКБ, что влияет я на их вздутие и взрывы - пожалуйста, я внимательно прочитаю эту информацию, может быть, что-то подчеркну для себя. Заранее спасибо.
     
  14. akl

    akl Гик

    возможно там по ссылке слишком много букв. на самом деле это решение очень простое, если на пальцах - то надо засекать текущее время в момент срабатывания условия, по которому реле включается, например записав текущее время в этот момент в переменную
    timer = millis();
    а потом в цикле вставить условие, что отключится реле только когда текущее время превысит засеченное более чем на определенное количество миллисекунд
    if(millis()-timer>3000 && digitalRead(Relay2)==1){
    digitalWrite( Relay2, LOW );
    }
     
    Последнее редактирование: 7 окт 2019
  15. akl

    akl Гик

    насчет устройства - тоже не очень понял что это - типа умная розетка (вернее розетка с пду и таймером)? и что конкретно оно отключает - телефон от зарядки? или зарядку от розетки?.
    Самым надежным наверно было бы отключать зарядку от розетки, и не по времени, а по превышению/пропаданию тока и по температуре. А еще лучше чтоб это устройство и само себя тоже от розетки отключало при этом. И распыляло огнетушитель, но это уже слишком дорого будет
     
  16. parovoZZ

    parovoZZ Гуру

    Зарядку лития необходимо останавливать только по напряжению и ни в коем случае по времени.

    Будем называть вещи своими именами - будильник с электроконтактами))
     
    Airbus нравится это.
  17. спасибо за направление, буду пробовать
     
  18. Знаю что по напряжению, но знаний реализовать этого не хватит, поэтому по времени. Будут знания - будет по напряжению. Сейчас нужно так.

    Вы пишите: "ни в коем случае по времени". А почему это "ни в коем случае"??? Что произойдет, если я блок ЗУ выдерну из розетки, раньше чем он зарядит, например, телефон?
     
  19. Вам как "специалисту" виднее :) А мне и так сойдёт :D
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Если раньше то ничего если позже может разнести нах.
    Так а не проще и дешевле тогда розетка с таймером?