• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ściemniacz i przyciski
#1
Witam.
Walczę od jakiegoś czasu z układem dimmera. Chce zrobić tak, aby układ był sterowany czterema przyciskami:
- Przycisk nr 1 - załączanie i wyłączanie przekaźnika
- Przycisk nr 2 - załączanie i wyłączanie 1 poziomu jasności
- Przycisk nr 3 - załączanie i wyłączanie 2 poziomu jasności
- Przycisk nr 4 - załączanie i wyłączanie 3 poziomu jasności
oraz za pomocą pilota IR:
Przycisk nr 1 - załączanie przekaźnika
Przycisk nr 2 - wyłączanie przekaźnika
- Przycisk nr 3 - załączanie 1 poziomu jasności
- Przycisk nr 4 - załączanie 2 poziomu jasności
- Przycisk nr 5 - załączanie 3 poziomu jasności
- Przycisk nr 6 - wyłączanie światła.
Na początki zrobiłem tak:

Kod:
#include <ezButton.h>
#include <TimerOne.h>
#include "IRremote.h"

#define IR_RECEIVE_PIN 3  
long data = 0;  

const int RELAY_PIN  = 12; // Arduino pin connected to relay's pin

const int BUTTON1_PIN=4;
const int BUTTON2_PIN=6;
const int BUTTON3_PIN=8;
const int BUTTON4_PIN=11;
const int LED1_PIN=5;
const int LED2_PIN=7;
const int LED3_PIN=9;
const int LED4_PIN=10;

volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 13;                 // Output to Opto Triac
int dim = 0;                  // Dimming level (0-128)  0 = on, 128 = 0ff                  
int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

ezButton button1(BUTTON1_PIN);
ezButton button2(BUTTON2_PIN);
ezButton button3(BUTTON3_PIN);
ezButton button4(BUTTON4_PIN);

int led1State=LOW;
int led2State=LOW;
int led3State=LOW;
int led4State=LOW;

void setup() {
  Serial.begin(115200);

  IrReceiver.begin(IR_RECEIVE_PIN);
 
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(LED4_PIN, OUTPUT);
  digitalWrite(LED1_PIN, HIGH);
  digitalWrite(LED2_PIN, HIGH);
  digitalWrite(LED3_PIN, HIGH);
  digitalWrite(LED4_PIN, HIGH);
  button1.setDebounceTime(50);
  button2.setDebounceTime(50);
  button3.setDebounceTime(50);
  button4.setDebounceTime(50);

  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);        // set arduino pin to output mode

  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);  
}

void zero_cross_detect()
{    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}                                
// Turn on the TRIAC at the appropriate time

void dim_check()
{                  
  if(zero_cross == true) {              
    if(i>=dim) {                    
      digitalWrite(AC_pin, HIGH);  // turn on light      
      i=0;  // reset time step counter                        
      zero_cross=false;    // reset zero cross detection
    }
    else {
      i++;  // increment time step counter                    
}}}

void translateIR() // takes action based on IR code received
{
  if (IrReceiver.decode()) {
     if (IrReceiver.decodedIRData.decodedRawData != 0) {
      data = IrReceiver.decodedIRData.decodedRawData;
    }
  switch(data)
  {
    case 0x24ACF947:
        led1State=LOW;
        digitalWrite(LED1_PIN, !led1State);
        digitalWrite(RELAY_PIN, !led1State);
        Serial.println("Light OFF");
        break;
    case 0xE208293C:
        led1State=HIGH;
        digitalWrite(LED1_PIN, !led1State);
        digitalWrite(RELAY_PIN, !led1State);
        Serial.println("Light ON");
        break;
     case 0xE3C01BE2:
        led2State=!led2State;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        Serial.println("W1");
        break;
     case 0xD051C301:
        led3State=!led3State;
        digitalWrite(LED3_PIN, !led3State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        Serial.println("W2");
        break;
     case 0xC22FFFD7:
        led4State=!led4State;
        digitalWrite(LED4_PIN, !led4State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        Serial.println("W3");
        break;
     case 0x55303A3:
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        Serial.println("WOFF");
        break;
        default : break;      
  }
  }
}

void loop() {
  button1.loop();
  button2.loop();
  button3.loop();
  button4.loop();

  if(button1.isPressed())
  {
    Serial.println("The button 1 is pressed");
    led1State=!led1State;
    digitalWrite(LED1_PIN, !led1State);
    digitalWrite(RELAY_PIN, !led1State);
  }
  if(button2.isPressed())
  {
    Serial.println("The button 2 is pressed");
    led2State=!led2State;
    digitalWrite(LED2_PIN, !led2State);
    led3State=LOW;
    digitalWrite(LED3_PIN, !led3State);
    led4State=LOW;
    digitalWrite(LED4_PIN, !led4State);
  }
  if(button3.isPressed())
  {
    Serial.println("The button 3 is pressed");
    led3State=!led3State;
    digitalWrite(LED3_PIN, !led3State);
    led2State=LOW;
    digitalWrite(LED2_PIN, !led2State);
    led4State=LOW;
    digitalWrite(LED4_PIN, !led4State);
  }
  if(button4.isPressed())
  {
    Serial.println("The button 4 is pressed");
    led4State=!led4State;
    digitalWrite(LED4_PIN, !led4State);
    led2State=LOW;
    digitalWrite(LED2_PIN, !led2State);
    led3State=LOW;
    digitalWrite(LED3_PIN, !led3State);
  }
  if(led2State == HIGH)
  {
    dim=0;
  }
  if(led3State == HIGH)
  {
    dim=0;
  }
  if(led4State == HIGH)
  {
    dim=0;
  }
  if(led4State == LOW && led4State == LOW && led4State == LOW)
  {
    dim=128;
  }

  if (IrReceiver.decode()) // have we received an IR signal?
  {
    translateIR();
    delay(50);
    IrReceiver.resume(); // Receive the next value
  }
}
Ale niestety w tej wersji ustawienie jasności działa tylko na 3 poziomie oraz jestem w stanie wyłączyć światło. Na pozostałych dwóch poziomach pomimo ustawienia tej samej wartości dim=0 żarówka miga.
Drugi program stworzyłem tak:

Kod:
#include <ezButton.h>
#include <TimerOne.h>
#include "IRremote.h"

#define IR_RECEIVE_PIN 3  
long data = 0;  

const int RELAY_PIN  = 12; // Arduino pin connected to relay's pin

const int BUTTON1_PIN=4;
const int BUTTON2_PIN=6;
const int BUTTON3_PIN=8;
const int BUTTON4_PIN=11;
const int LED1_PIN=5;
const int LED2_PIN=7;
const int LED3_PIN=9;
const int LED4_PIN=10;

volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 13;                 // Output to Opto Triac
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff                  
int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

ezButton button1(BUTTON1_PIN);
ezButton button2(BUTTON2_PIN);
ezButton button3(BUTTON3_PIN);
ezButton button4(BUTTON4_PIN);

int led1State=LOW;
int led2State=LOW;
int led3State=LOW;
int led4State=LOW;

void setup() {
  Serial.begin(115200);

  IrReceiver.begin(IR_RECEIVE_PIN);
 
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(LED4_PIN, OUTPUT);
  digitalWrite(LED1_PIN, HIGH);
  digitalWrite(LED2_PIN, HIGH);
  digitalWrite(LED3_PIN, HIGH);
  digitalWrite(LED4_PIN, HIGH);
  button1.setDebounceTime(50);
  button2.setDebounceTime(50);
  button3.setDebounceTime(50);
  button4.setDebounceTime(50);

  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);        // set arduino pin to output mode

  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);  
}

void zero_cross_detect()
{    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}                                
// Turn on the TRIAC at the appropriate time

void dim_check()
{                  
  if(zero_cross == true) {              
    if(i>=dim) {                    
      digitalWrite(AC_pin, HIGH);  // turn on light      
      i=0;  // reset time step counter                        
      zero_cross=false;    // reset zero cross detection
    }
    else {
      i++;  // increment time step counter                    
}}}

void translateIR() // takes action based on IR code received
{
  if (IrReceiver.decode()) {
     if (IrReceiver.decodedIRData.decodedRawData != 0) {
      data = IrReceiver.decodedIRData.decodedRawData;
    }
  switch(data)
  {
    case 0x24ACF947:
        led1State=LOW;
        digitalWrite(LED1_PIN, !led1State);
        digitalWrite(RELAY_PIN, !led1State);
        Serial.println("Light OFF");
        break;
    case 0xE208293C:
        led1State=HIGH;
        digitalWrite(LED1_PIN, !led1State);
        digitalWrite(RELAY_PIN, !led1State);
        Serial.println("Light ON");
        break;
     case 0xE3C01BE2:
        led2State=!led2State;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        Serial.println("W1");
        dim=100;
        break;
     case 0xD051C301:
        led3State=!led3State;
        digitalWrite(LED3_PIN, !led3State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        Serial.println("W2");
        dim=50;
        break;
     case 0xC22FFFD7:
        led4State=!led4State;
        digitalWrite(LED4_PIN, !led4State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        Serial.println("W3");
        dim=0;
        break;
     case 0x55303A3:
        led4State=LOW;
        digitalWrite(LED4_PIN, !led4State);
        led2State=LOW;
        digitalWrite(LED2_PIN, !led2State);
        led3State=LOW;
        digitalWrite(LED3_PIN, !led3State);
        Serial.println("WOFF");
        dim=128;
        break;
        default : break;      
  }
  }
}

void loop() {
  button1.loop();
  button2.loop();
  button3.loop();
  button4.loop();

  if(button1.isPressed())
  {
    Serial.println("The button 1 is pressed");
    led1State=!led1State;
    digitalWrite(LED1_PIN, !led1State);
    digitalWrite(RELAY_PIN, !led1State);
  }
  if(button2.isPressed())
  {
    Serial.println("The button 2 is pressed");
    led2State=!led2State;
    digitalWrite(LED2_PIN, !led2State);
    led3State=LOW;
    digitalWrite(LED3_PIN, !led3State);
    led4State=LOW;
    digitalWrite(LED4_PIN, !led4State);
    dim=100;
  }
  if(button3.isPressed())
  {
    Serial.println("The button 3 is pressed");
    led3State=!led3State;
    digitalWrite(LED3_PIN, !led3State);
    led2State=LOW;
    digitalWrite(LED2_PIN, !led2State);
    led4State=LOW;
    digitalWrite(LED4_PIN, !led4State);
    dim=50;
  }
  if(button4.isPressed())
  {
    Serial.println("The button 4 is pressed");
    led4State=!led4State;
    digitalWrite(LED4_PIN, !led4State);
    led2State=LOW;
    digitalWrite(LED2_PIN, !led2State);
    led3State=LOW;
    digitalWrite(LED3_PIN, !led3State);
    dim=0;
  }
  if (IrReceiver.decode()) // have we received an IR signal?
  {
    translateIR();
    delay(50);
    IrReceiver.resume(); // Receive the next value
  }
}
W tej wersji poziomy jasności ustawiają się poprawnie, ale nie wiem jak zrobić warunek, żeby pierwsze naciśnięcie przycisku od 2 do 3 ustawiło poziom jasności, a drugie naciśnięcie wyłączyło światło.
Oczywiście nie są to w 100% moje programy, bazuję na przykładach znalezionych w Internecie. Proszę o porady w którą stronę iść.
 
Odpowiedź
  


Wiadomości w tym wątku
Ściemniacz i przyciski - przez orlicki12 - 27-01-2024, 20:52
RE: Ściemniacz i przyciski - przez kaczakat - 27-01-2024, 21:20
RE: Ściemniacz i przyciski - przez orlicki12 - 28-01-2024, 12:15
RE: Ściemniacz i przyciski - przez kaczakat - 28-01-2024, 22:58

Skocz do:


Przeglądający: 1 gości