Диммер лампы на 220В на Arduino Pro Mini ATmega328P

Тема в разделе "Arduino & Shields", создана пользователем Vovka, 1 фев 2019.

  1. Vovka

    Vovka Гик

    Вот фрагменты кода, чтоб было понятно, какие ресурсы используются.
    Код (C++):

    #include "DS1307RTC.h"
    #include <OneWire.h>
    #include <DS18B20.h>
    #include <iarduino_DHT.h>
    #include <LiquidCrystal_I2C.h>

    void Interupt50Hz() // прерывание 50герц, оба полупериода
    {
       b50Hz = 1;
    //  delayMicroseconds(5000);  // если раскомментировать эти 3 строчки и менять значение задержки
    //  digitalWrite( PIN_SVET, HIGH ); // то меняется яркость - т.е. управление работает
    //  digitalWrite( PIN_SVET, LOW );
      if( !countDelaySvet ) countDelaySvet = 25; // задержка
    }

    void timerInterupt()
    {
      if( b50Hz ) { b50Hz = 0;
        if( countDelaySvet ) { countDelaySvet--;
           if( !countDelaySvet ) {
              digitalWrite( PIN_SVET, HIGH );
              digitalWrite( PIN_SVET, LOW );
           }
        }
      }
    }
     
    Теперь самое интересное. Какую использовать библиотеку, чтобы не конфликтовала с вышеуказанными подключенными библиотеками, чтобы вызывать timerInterupt()? Прерывание нужно в микросекундах.
    Ядро оба восьмибитных таймера использует?
     
  2. parovoZZ

    parovoZZ Гуру

    не проще ли от абдурины совсем отказаться?
     
    Airbus нравится это.
  3. Airbus

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

    Ну да.
     
  4. Vovka

    Vovka Гик

    Уже вляпался...
    Есть вариант использовать библиотеку CyberLib, исправив под нее все библиотеки. Но это время...
    Как все хорошо начиналось: подключай готовые библиотеки и собирай все в кучу... а нет, например:
    "timer-api.h" + "LiquidCrystal_I2C.h" - в итоге ничего не работает...
     
  5. parovoZZ

    parovoZZ Гуру

    Ну...со временем наработаешь свои библиотеки и поймешь, что ковыряться в чужой пииии совсем не царское дело.
    У меня вся работа с таймерами происходит в main.c. Поэтому в файлах-драйверах их нет. Это упрощает перенос наработок между проектами. А, ну еще вверху файла всегда пишу дату модификации, чтобы понимать, где последняя версия лежит.
     
    Daniil нравится это.
  6. SergeiL

    SergeiL Оракул Модератор

    На указанной странице есть ссылка на диммер на меге, чем он не понравился?
    Там используется TimerOne.h
     
  7. Vovka

    Vovka Гик

    Есть, рабочий код, но как написан??? Мне таймеры нужны, а там таймер чисто под диммер отдан, да и еще в придачу переназначение прерывания, отключение-включение таймера...зачем??? Код писал человек, далекий от понимания как работает симистор!
     
  8. parovoZZ

    parovoZZ Гуру

    В меге их знаешь сколько?
     
  9. Vovka

    Vovka Гик

    В курсе, но сделать надо на мини :(
     
  10. SergeiL

    SergeiL Оракул Модератор

    Так если Вы все понимаете, поправьте код как нужно, там кода то два экрана.
    Кто Вам мешает таймер настроить как нужно, и в обработчике таймера еще что-то делать?
    millis() сидит на нулевом таймере.
     
  11. Vovka

    Vovka Гик

    Уже исправил и таймер теперь можно использовать для своих нужд.
    А первый таймер ядром используется?
     
  12. b707

    b707 Гуру

    ну так перепиши сам. А то на словах такой знаток, а как скетч понадобился - у форума просишь.
     
  13. Vovka

    Vovka Гик

    Вообще-то вопрос у меня по таймерам, а код я уже переписал и походу пока конфликтов библиотек не наблюдается!
     
    b707 нравится это.
  14. b707

    b707 Гуру

    ну тогда извини
     
  15. SergeiL

    SergeiL Оракул Модератор

    Я же написал, millis() сидит на нулевом, первый можно использовать.
    Но он может быть задействован и в библиотеках.
    Но, в указанном, в первом сообщении списке, на первый взгляд, он не нужен.

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

    Это связано, в первую очередь, с болтанием в пределах одного тика таймера.
    В коде (через TimerOne) нет сброса предделителей таймера.

    В свое время я отлаживался под Leonardo, потом перенес диммер на AtTiny.

    На Tiny с аппаратным I2C он работает супер стабильно!

    Двухканальные диммеры подключены к ESP8266 по I2C, ESP принимает команды и передает состояние на OpenHAB по mqtt, и кидает на диммер необходимую мощность. Диммер просто диммирует по заданной от 0% до 100% мощности.
    Кроме выключателя - диммера, на ESP заведены датчики температуры, счетчики воды PIR, герконы на дверях и т.д. Часть через расширители PCF8574.