Плавное управление сетевым напряжением. Arduino, Espruino.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 23 янв 2016.

  1. Artemius

    Artemius Нуб

    Про управление тоже не объясните? Еврейский подход объяснять за деньги
     
  2. все уже давно разжевано, только некто не читает.
     
  3. sirota

    sirota Нерд

    Вам лучше ни как не управлять этой штукой. Я бы вообще не советовал соваться в электронику дальше чем включить и пользоваться. Тем более тут так все разжевано, что я не сильно волокущий в теме даже не сохранял схему, ибо ее смысл прост как 2 копейки.
     
  4. ИгорьК

    ИгорьК Гуру

    Что имею добавить к сказанному выше.
    1. Схема с твердотельным реле - рабочая. Таким образом, самое "маложелезное" устройство выглядит так:
    [​IMG]
    Безусловно, следует наблюдать за ограничениями по току для реле.

    2. Управлять электричеством можно и с Iskra JS. Делается это так:
    Код (Javascript):
    // Выход фазового управления
    var pinOut = A0;    
    // Вход для наблюдения
    var pinWatchAC = A0;

    // Переменная для управления,
    // ее диапазон от 0.2 до 9.
    var runAC = 5;      

    // Устанавливаем наблюдение за пином
    setWatch(function(e) {
    // По наблюдаемому событию, сбрасываем ногу в ноль
    // и через runAC мс возвращаем в единицу
      digitalPulse(pinOut, 0, runAC);
    }, pinWatchAC, {
    // Смотрим ногу постоянно
      repeat: true,
    // Реагируем на восходящий фронт
    edge: 'rising',
    });

    //------------------------------------------------------------------------------------------------------

    // Еще раз - просто кусок кода, чтобы увидеть как это коротко:
    var pinOut = A0;
    var pinWatchAC = A0;
    var runAC = 5;
    setWatch(function (e) {
       digitalPulse(pinOut, 0, runAC);
    }, pinWatchAC, {
       repeat : true,
       edge : 'rising',
    });
    Как видите, все ОЧЕНЬ просто, если бы не одно но...
     
    Последнее редактирование: 24 окт 2016
  5. uvlich

    uvlich Нуб

    Не все твердотелки позволяют включать нагрузку при напряжении, отличном от нуля. Так что чтение даташитов избавит от разочарования.
    Тэны лучше регулировать изменением скважности прямоугольного сигнала (при этом твердотелка сама отработает включения и выключения при 0, т. е. можно подавать сигнал напрямую с SOFT_PWM ардуинки), а лампы накаливания лучше переводить на постоянку - не мерцают при регулировке. А для инкубатора хватит простого тиристорного регулятора с плавным поджигом. (схемка где-то в журнале "Радио" приблизительно за 1988 год.
     
  6. ИгорьК

    ИгорьК Гуру

    Кладезь мудрости.
     
    Последнее редактирование: 3 ноя 2016
  7. uvlich

    uvlich Нуб

    Пользуйтесь, не жалко. Концом развития темы, видимо, будет инвертор для 3-х фазного двигателя.
     
  8. incvisitor

    incvisitor Нерд

    Почему максимум 159,поясните?
     
  9. ИгорьК

    ИгорьК Гуру

    Точно не помню как установил это значение. Но это железно так.

    Если в общих чертах, то полупериод (управляемого электрического тока) в течение которого может происходить переключение симистора делится не на бесконечное число промежутков времени, а на определенное, связанное с частотой работы таймера, который помогает это делать.
    Эта частота и определяет число.
     
  10. incvisitor

    incvisitor Нерд

    Плчему Arduino pro mini,будет ли работать если подключить на arduino uno?
     
  11. incvisitor

    incvisitor Нерд

    Вот такая схема
     
  12. incvisitor

    incvisitor Нерд

    upload_2018-11-15_17-0-59.png


    Я хочу нажимая кнопку увеличивать myPWM,а по второй уменьшат
    Подскажите,что подправить...
    // Arduino Pro mini - Atmega328P https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
    // INT1 - PD3. Нога для подключения детектора перехода
    // A1 - PC1. А1 - управление триаком.

    #include <avr/interrupt.h>
    volatile unsigned int myPWM = 0; // Включено максимально - 159
    // volatile uint8_t sreg; // Переменная для запоминания регистра SREG
    int STEP = 5;



    ISR(TIMER1_COMPA_vect ){ // Отработка прерывания Timer1 по сравнению с регистром OC1A
    PORTC |= ( 1 << PC1 ); // Установка A1 в 1
    }

    ISR(INT1_vect) {
    PORTC &= ~( 1 << PC1 ); // Сброс A1 в 0
    // sreg = SREG; // Запомнили состояние общего флага прерываний
    // cli();
    TCNT1 = myPWM;
    // SREG = sreg;
    }

    void setup() {
    pinMode(6, INPUT);
    pinMode(7, INPUT); //устанавливаем 6 й и 7 й цифровой порт на ввод для опроса кнопок
    digitalWrite(6, HIGH); //Притягиваем 6 вывод к единице.
    digitalWrite(7, HIGH); //Притягиваем 7 вывод к единице.
    // Port C - инициализация. PC1 - нога A1 Arduino
    // Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In
    DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (0<<DDC0);
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0xA0;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 1 Interrupt(s) initialization
    TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
    EICRA=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
    EIMSK=(1<<INT1) | (0<<INT0);
    EIFR=(1<<INTF1) | (0<<INTF0);
    PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

    Serial.begin(9600);

    // Разрешаем прерывания
    sei();
    }

    void loop() {
    if (digitalRead(6) == LOW) //нажатие на первую кнопку увеличит яркость
    {delay(100);
    myPWM = myPWM + STEP;
    delay(50);

    }
    if (digitalRead(7) == LOW) //нажатие на вторую кнопку уменьшит яркость
    {delay(100);
    myPWM = myPWM - STEP;
    delay(50);
    }


    }
     
  13. ИгорьК

    ИгорьК Гуру

    Скорее всего будет - вряд и было использовано что-то специфическое.

    1. Вставлять код сюда правильно. Через 9 кнопку в панели инструментов.

    2. Программировать без применения функции delay(). Вот руководство как это делать: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview#
    Там три части.
     
  14. incvisitor

    incvisitor Нерд

    static unsigned long timer = millis();
    if (millis() - timer >= 1000) {
    timer += 1000;
    }
     
  15. incvisitor

    incvisitor Нерд

    Вместо функции delay
    Код (C++):
    void loop() {
       static unsigned long timer = millis();
      if (millis() - timer >= 1000) {
    //наш код
    timer += 1000;
      }

    }
     
  16. ИгорьК

    ИгорьК Гуру

    ой, давно я на Си не тренировался.
    Не буду советовать дальше, сейчас кто-нибудь еще появится.
    А вы пока напишите полный код с правильным оформлением.
     
  17. incvisitor

    incvisitor Нерд

    Хочу на Arduino Uno
    повторить схему ИгорьК(собрал на Arduino Pro mini)
    Добавил в схему две кнопки на D6(увеличение) и D7(Уменьшение) myPWM.Я не знаю будет ли скетч работать.Ведь в ИгорьК он под Arduino Pro mini

    Код (C++):
    // Arduino Pro mini - Atmega328P https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
    // INT1 - PD3. Нога для подключения детектора перехода
    // A1 - PC1. А1 - управление триаком.

    #include <avr/interrupt.h>
    volatile unsigned int myPWM = 0;  // Включено максимально - 159
    // volatile uint8_t sreg;                // Переменная для запоминания регистра SREG
    int STEP = 5;
    static unsigned long timer = millis();

    ISR(TIMER1_COMPA_vect ){            // Отработка прерывания Timer1 по сравнению с регистром OC1A
        PORTC |= ( 1 << PC1 );            // Установка A1 в 1
    }

    ISR(INT1_vect) {
        PORTC &= ~( 1 << PC1 );            // Сброс A1 в 0
        // sreg = SREG;                    // Запомнили  состояние общего флага прерываний
        // cli();          
        TCNT1 = myPWM;
        // SREG = sreg;
    }

    void setup() {
      pinMode(6, INPUT);
      pinMode(7, INPUT);  //устанавливаем 6 й и 7 й цифровой порт на ввод для опроса кнопок
      digitalWrite(6, HIGH);   //Притягиваем  6 вывод к единице.
      digitalWrite(7, HIGH);   //Притягиваем  7 вывод к единице.
     
        // Port C - инициализация. PC1 - нога A1 Arduino
        // Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In
        DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (0<<DDC0);
        TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
        TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (1<<CS12) | (0<<CS11) | (1<<CS10);
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0xA0;
        OCR1BH=0x00;
        OCR1BL=0x00;

        // Timer/Counter 1 Interrupt(s) initialization
        TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (1<<OCIE1A) | (0<<TOIE1);
        EICRA=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
        EIMSK=(1<<INT1) | (0<<INT0);
        EIFR=(1<<INTF1) | (0<<INTF0);
        PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

        Serial.begin(9600);

        // Разрешаем прерывания
        sei();
    }

    void loop() {
          if (digitalRead(6) == LOW)  //нажатие на первую кнопку увеличит яркость
          {
                if (millis() - timer >= 1000)
                {
              //наш код
              myPWM = myPWM + STEP;
              timer += 1000;
                }
          }
           if (digitalRead(7) == LOW)  //нажатие на вторую кнопку уменьшит яркость
           {
                   if (millis() - timer >= 1000) {
                      //наш код
                      myPWM = myPWM - STEP;
                      timer += 1000;
                        }
         
           }

       
    }
     
    [​IMG]
     
  18. incvisitor

    incvisitor Нерд

    В ИгорьК предлагает
    Arduino Pro mini - Atmega328P https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

    в нем сосвсем другая распиновка
    ведь Arduino Pro mini выглядит вот так
     
  19. incvisitor

    incvisitor Нерд

    В ИгорьК предлагает
    Arduino Pro mini - Atmega328P https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

    в нем сосвсем другая распиновка
    ведь Arduino Pro mini выглядит вот так
     
  20. DIYMan

    DIYMan Guest

    Строго говоря, к timer надо плюсовать не 1000, а разницу между millis() и текущим значением timer, если хотите именно плюсовать. Далее - есть другие подводные камни в приведенном куске кода: там, где написано "наш код" - этот код может выполняться ДОЛЬШЕ секунды, догадайтесь, что получится в итоге ;) Более правильный подход, пмсм, такой:

    Код (C++):
    void loop() {
       static unsigned long timer = millis();
      if (millis() - timer >= 1000) {
    //наш код
    timer  = millis();
      }

    }
     
    incvisitor нравится это.