Bluetooth + диммер на ATtiny85

Тема в разделе "Arduino & Shields", создана пользователем Motrosoff, 25 фев 2018.

Метки:
  1. Motrosoff

    Motrosoff Гик

    Ребят здравствуйте! В общем такая проблемка, собрал схему стандартную для диммирования нагрузки 220в, управляет (должна управлять) всем этим Тинька85. Приложение для работы по БТ и собственно самого диммирования собрано в Апинвенторе2 (ничего сложного, две кнопки Вкл; Выкл и ползунок для диммирования).
    Сама проблема: при использовании ползунка, лампочка начинает хаотично мерцать, совсем не похоже на плавное затухание или плавное разгорание.....! В чём проблема кроется? Сама схема работает исправно (проверял скетчем с где лампочка сама по себе медленно гаснет и медленно разгорается)!
    Код (C++):
    #include <SoftwareSerial.h>

    SoftwareSerial TinySerial (3, 4);

    int AC_pin = 1;//Pin to OptoTriac
    byte dim = 0; //Initial brightness level from 0 to 255, change as you like!

    void setup() {
    TinySerial.begin(9600);
    pinMode(AC_pin, OUTPUT);
    attachInterrupt(0, light, FALLING);//When arduino Pin 2 is FALLING from HIGH to LOW, run light procedure!
    }

    void light() {
    if (TinySerial.available()) {
    dim = TinySerial.read();
    if (dim < 1) {
    //Turn TRIAC completely OFF if dim is 0
    digitalWrite(AC_pin, LOW);
    }

    if (dim > 254) { //Turn TRIAC completely ON if dim is 255
    digitalWrite(AC_pin, HIGH);
    }
    }

    if (dim > 0 && dim < 255) {
    //Dimming part, if dim is not 0 and not 255
    delayMicroseconds(34 * (255 - dim));
    digitalWrite(AC_pin, HIGH);
    delayMicroseconds(500);
    digitalWrite(AC_pin, LOW);
    }
    }
    void loop() {
    }
     

    Вложения:

  2. Motrosoff

    Motrosoff Гик

    Кстати вот скетч где лампочка нормально разгорается и гаснет! НО есть пауза в секунд 20 между следующим разжиганием, а в скетче этой паузы нет...
    Код (C++):
    int AC_LOAD = 1; // Output to Opto Triac pin
    volatile int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
    int LED = 0;
    int val;
    void setup()
    {

    pinMode(LED, OUTPUT);
    pinMode(AC_LOAD, OUTPUT); // Set the AC Load as output
    attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
    }

    void zero_crosss_int() // function to be fired at the zero crossing to dim the light
    {
    // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
    // (10000us - 10us) / 128 = 75 (Approx)
    int dimtime = (75 * dimming);
    delayMicroseconds(dimtime); // Off cycle
    digitalWrite(AC_LOAD, HIGH); // triac firing
    delayMicroseconds(10); // triac On propogation delay
    digitalWrite(AC_LOAD, LOW); // triac Off
    }

    void loop()
    {
    for (int i = 1; i <= 128; i++) {
    dimming = i;
    delay(50);
    }
    for (int i = 128; i >= 1; i -= 1) {
    dimming = i;
    delay(50);

    }
    }
     
  3. Motrosoff

    Motrosoff Гик

    Как подключил к Тиньки85
     

    Вложения:

  4. 9xA59kK

    9xA59kK Гик

    Не используй Serial и будет тебе счастье, он сильно тормозит программу.
     
  5. Motrosoff

    Motrosoff Гик

    У тини нет UART(((
     
  6. 9xA59kK

    9xA59kK Гик

    Програмный сериал тоже тормоз.
     
  7. Motrosoff

    Motrosoff Гик

    Хорошо, а если предположить, что проблема не в сериал......?!
     
  8. Motrosoff

    Motrosoff Гик

    пробовал на УНО такая же хрень((
     
  9. parovoZZ

    parovoZZ Гуру

    В дебаге погоняй программу и узнаешь где косяк.
     
  10. YeS

    YeS Гик

    Тупой вопрос, конечно, задам, но всё-же. Лампа то диммируемая? И что за ползунок? Если программный, то вопросов нет, а если физический, то может просто так себе ползунок?
    Вообщем, рекомендую проверить с обычной лампой накаливания.
     
  11. 9xA59kK

    9xA59kK Гик

    У вас в первом исходнике прерывание используется по " FALLING " , т.е по спадающему фронту, а в следующем посте вы используете "возрастающий" фронт - чем это объясняется?
    attachInterrupt(0, light, FALLING);//When arduino Pin 2 is FALLING from HIGH to LOW, run light procedure!
    Программа не соответствует схеме.
    По схеме вам надо и спадающий фронт использовать и возрастающий. у вас ведь переменный ток , поэтому надо два прерывания на возрастающий фронт и спадающий. Я думаю вы вырезали часть кода из какой-то программы, а другую часть опустили. Я собирал такое управление на UNO и ваш код мне это напомнил. Если хотите один раз использовать прерывание надо схему изменить и использовать диодный мост в силовой части схемы.Где то была ссылка на статью, здесь на форуме есть поищите. На скорую руку нашел одну.
    ps\\ Я собирал вот по этим статьям одна, вторая.
     
    Последнее редактирование: 28 фев 2018
  12. Motrosoff

    Motrosoff Гик

    Самая обычная лампа накаливания (40Втт). Ползунок программный, т.е. в созданном приложении вожу пальцем .... данные палзунка передаются по БТ
     
  13. Motrosoff

    Motrosoff Гик

    ...Я код взял с инета и так как я не особо ещё разбираюсь в ардуино то я такую вещь и не заметил даже!!!! Можете показать как в коде сделать и спадающую возрастающую...????
     
  14. Motrosoff

    Motrosoff Гик

    Но диодный мост ведь нужен чисто для оптопары с одним диодом, у меня же оптопара с двумя и там вроде как не нужен мост!
     
  15. SergeiL

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

    Ну, кто же так делает, в прерывании читать Serial.
    Читайте Serial в loop, сохраняйте значение в переменную, ту же dim.
    А в прерывании только включайте и выключайте оптрон.

    Так же как во втором скетче, в loop вместо for перенесите чтение из Serial и проверки на max/min.
     
    9xA59kK нравится это.
  16. Motrosoff

    Motrosoff Гик

    Пробовал:
    Код (C++):
    #include <SoftwareSerial.h>

    SoftwareSerial TinySerial (3, 4); // RX, TX

    int LED = 0;
    int val;
    int dimpin = 1; // Выход диммера на симистор
    char dim = 50; // Начальный уровень диммирования от 0 до 255
    int light = 0;

    void setup() {
    TinySerial.begin(9600);
    pinMode(LED, OUTPUT);
    pinMode(dimpin , OUTPUT); // установим выход диммера
    attachInterrupt(0, lightset, FALLING); // прерывание для детектора нуля (2 пин!!!)
    }

    void loop()
    {
    if (TinySerial.available())
    {
    val = TinySerial.read();
    // При символе "W" включаем светодиод
    if (val == 'W')
    {
    digitalWrite(LED, HIGH);
    }
    // При символе "S" выключаем светодиод
    else if ( val == 'S')
    {
    digitalWrite(LED, LOW);
    }
    else{
    dim = val;
    if (dim > 0 && dim < 255) { // утановим диммирование, если dim не равен 0 или 255
    delayMicroseconds(33 * (255 - dim)); // вместо 33 былло 34, так между прочим. но если dim = 5 лампа припадошно мигает
    digitalWrite(dimpin , HIGH);
    delayMicroseconds(500);
    digitalWrite(dimpin , LOW);
    }
    }
    }
    }
     
  17. Motrosoff

    Motrosoff Гик

    Тут ещё в этом коде есть отдельное включение выключение светодиода...там потом реле будет...НО всё ровно всё также не работает(
     
  18. 9xA59kK

    9xA59kK Гик

    Не обратил внимания, такую схему с двумя диодами я не пробовал, поэтому ничего сказать не могу. Но, все равно, два прерывания надо обрабатывать и на FALLING и на RISING. И учесть высказывание SergeiL. Да и я же дал две ссылки с примерами, там уже код готовый и рабочий, по крайней мере на "Уно". И там же описан принцип работы этой схемы.
     
    Последнее редактирование: 28 фев 2018
  19. SergeiL

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

    Я же написал, в loop только чтение Serial, а не управление выходом на оптопару!

    Если Вы говорите, что второй скетч работает - берем его за основу, и переносим туда Serial.
    будет как то так:
    Код (C++):

    #include <SoftwareSerial.h>
    SoftwareSerial TinySerial (3, 4);


    int AC_LOAD = 1; // Output to Opto Triac pin
    volatile int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF

    int LED = 0;
    int val;
    int dimtime;
    void setup()
    {

    pinMode(LED, OUTPUT);
    pinMode(AC_LOAD, OUTPUT); // Set the AC Load as output
    attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
    }

    void zero_crosss_int() // function to be fired at the zero crossing to dim the light
    {
      if (dimtime < 1) //Turn TRIAC completely OFF if dim is 0  
      {
      digitalWrite(AC_LOAD, LOW);
      } else if (dimtime > 254)  //Turn TRIAC completely ON if dim is 255
      {
      digitalWrite(AC_LOAD, HIGH);
      }
      else
      {
      // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
      // (10000us - 10us) / 128 = 75 (Approx)
      dimtime = (75 * dimming);
      delayMicroseconds(dimtime); // Off cycle
      digitalWrite(AC_LOAD, HIGH); // triac firing
      delayMicroseconds(10); // triac On propogation delay
      digitalWrite(AC_LOAD, LOW); // triac Off
      }
    }

    void loop()
    {
      if (TinySerial.available())
      {
      dimtime = TinySerial.read();
      }
    }
     
    UPD. Добавил полностью выключено/включено.
     
    Последнее редактирование: 28 фев 2018
  20. parovoZZ

    parovoZZ Гуру

    А, ну понятно. Улетаешь с открывающим импульсом на вторую полуволну. От того и мерцания.