Se afișează postările cu eticheta AC dimmer. Afișați toate postările
Se afișează postările cu eticheta AC dimmer. Afișați toate postările

joi, 9 aprilie 2015

Variator de tensiune pentru bec cu Arduino (VIII)

   Acum ceva timp am prezentat si am facut experimente cu reglajul intensitatii luminoase la bec cu incandescenta alimentat de la retea si le-am in mai multe articole:
Variator de tensiune pentru bec folosind un Arduino
Variator de tensiune pentru un bec cu Arduino (II)
Variator de tensiune pentru bec cu Arduino (III)
Variator de tensiune pentru bec cu Arduino (IV)
Variator de tensiune pentru bec cu Arduino (V)
Variator de tensiune pentru bec cu Arduino (VI)
Variator de tensiune pentru bec cu Arduino (VII)
   Controlul a fost facut prin intermediul unui modul care contine un sistem de detectie a trecerii prin zero a tensiunii si a unuia de comanda a unui triac cu o anumita intarziere fata de trecerea prin zero a tensiunii. Modul aceste functioneaza bine pe pe placi Arduino clasice, sa zic asa, gen Uno, Mega, Micro, Nano, care au microcontrolere pe 8 biti folosondu-se de "intreruperi". 
   Placa Arduino Due are alta clasa de microcontroler (AT91SAM3X8E), mult mai puternic, dar care nu lucreaza ca si celelalte.. mai ale pentru aplicatia de fata..
   Am revenit la placa adaptoare prezentata in primul articol, care are intercalata o fotorezistenta in circuitul de comanda a unui triac dintr-un variator de tensiune clasic. Schema de la care am pornit este cea de la http://www.epanorama.net/

   Schema montajului meu este:

   Tot, in primul articol, am mai prezentat si schema din articolul AC Dimmer for Arduino
   Experimentele realizate de mine au fost facute cu varianta simplificata si am facut un filmulet numit variator de tensiune pentru bec cu comanda led si fotorezistenta
   Optocuplorul meu a fost facut in graba dintr-un led alb si o fotorezistenta, peste care am dat cu banda izolatoare neagra.. urmand sa mai lucrez la partea fizica, dar pentru primele experimente "merge"...
   Din primele teste am constatat ca reglajul nu este liniar, dar am reusit sa fac 5 trepte de intensitate luminoasa (stins + 5 trepte), dupa cum se vede si in filmulet... prin inserierea unei rezistente de 410k cu LED-ul si am obtinut tensiunea maxima pe bec la cca. 90-95% din tensiunea retelei. Rezistenta de 410k am obtinut-o din 2 rezisnte de 820k in paralel.
   Sketch-ul folosit pentru experimentul din filmulet este:
/*
AC dimmmer for incandescent lamp using schematic from http://epanorama.net/
and http://nicuflorica.blogspot.ro/2013/02/variator-de-tensiune-pentru-bec.html
sketch for test is made by niq_ro from http://www.tehnic.go.ro
http://nicuflorica.blogspot.ro/
si http://arduinotehniq.blogspot.com/
 */

int ledPin = 9;    // LED connected to digital pin 9

void setup()  { 
 // initialize serial:
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);  
} 

void loop()  { 
 analogWrite(ledPin, 0);         
 Serial.println("bec stins");
 Serial.println("----------------------------------");
 delay(10000);
 
 analogWrite(ledPin, 27);         
 Serial.println("treapta 1");
 Serial.println("----------------------------------");
 delay(10000);
 
 analogWrite(ledPin, 35);         
 Serial.println("treapta 2");
 Serial.println("----------------------------------");
 delay(10000);
 
 analogWrite(ledPin, 50);         
 Serial.println("treapta 3");
 Serial.println("----------------------------------");
 delay(10000);

 analogWrite(ledPin, 80);         
 Serial.println("treapta 4");
 Serial.println("----------------------------------");
 delay(10000);
 
 analogWrite(ledPin, 255);         
 Serial.println("treapta 5 - bec aprins la maxim");
 Serial.println("----------------------------------");
 delay(10000);
 
}
   Intre timp, am primit un "pont" cu un sistem de reglaj al intensitatii luminoase cu tranzistor MOSFET. Este vorba de articolul Safe and simple AC PWM Dimmer for arduino / Raspberry pi care isi are originile in articolul de la Dimmer With A MOSFET, care la randul ei este preluata din revista Elektor.
   Pentru aceasta schema am desenat o varianta de cablaj, folosindu-ma de programul Eagle PCB Editor:
   Pe net, am mai gasit articol Simple AC PWM Dimmer for Arduino, care prezinta aceasta schema:
8.6.2015
   Am reusit, cu ajutorul lui Cristi din Satu Mare, sa-mi fac un modul cu tranzistor mosfet, asa ca am facut si niste filmulete, dar postez doar pe cel numit variator de tensiune pentru bec la 230V cu MOS-FET (2)

   Sketch-ul folosit se gaseste pe https://github.com/tehniq3 !!!

3.8.2015
  Am pus osciloscopul EM125 la bornele becului, pentru a vedea formele de unda si am facut filmuletul numit variator de tensiune pentru bec la 230V cu MOS-FET (3)
24.05.2017
   Am pus pe canalul de Github si cablajul ca fisier brd (pentru Eagle PCB) sau direct de listat ca fisier pdf !!!

sâmbătă, 25 ianuarie 2014

Variator de tensiune pentru bec cu Arduino (VII)

   Dupa cum am scris si in articlul anterior, Smartphone ca telecomanda prin bluetooth pentru Arduino (II), acum am completat partea de variator de tensiune pentru becuri cu incandescenta cu comanda prin bluetooth de pe un telefon cu Android, care era prezentata in articolul Variator de tensiune pentru bec cu Arduino (VI).
   Schemele de conectare sunt combinatia celor 2:
iar modulul notat in schema "AC dimmer unit" are schema:
   Nota: Detalii de realizare a acestuia gasiti in articolul Variator de tensiune pentru bec folosind un Arduino !!!
   Am folosit urmatorul sketch (care nu-i "periat", dar e functional):
/*
AC Light Control
 Updated by Robert Twomey <rtwomey@u.washington.edu>
 Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445 
 and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
 adapted sketch by niq_ro from
 http://www.tehnic.go.ro 
 http://www.niqro.3x.ro 
 http://nicuflorica.blogspot.com 

IR Remote Kit Test
 Uses YourDuino.com IR Infrared Remote Control Kit 2
 http://arduino-direct.com/sunshop/index.php?l=product_detail&p=153
 based on code by Ken Shirriff - http://arcfn.com
 Get Library at: https://github.com/shirriff/Arduino-IRremote

Bluetooth:
// adapted sketch from http://english.cxem.net/arduino/arduino4.php
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/

#include "IRremote.h"
//-----( Declare Constants )-----
int receiver = 7; // pin 1 of IR receiver to Arduino digital pin 7
//-----( Declare objects )-----
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
//-----( Declare Variables )-----


#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

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 = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m6.1 (23.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

char incomingByte;  // incoming data from serial 9bluetooth)
 
void setup() {  // Begin setup

  Serial.begin(9600); // initialization
  
  irrecv.enableIRIn(); // Start the IR receiver (classic remote)

  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  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);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

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                     
    }                                
  }    
}                                      


//-----( Declare User-written Functions )-----
void translateIR() // takes action based on IR code received

// describing Car MP3 IR codes 
{
  switch(results.value)
  {
  case 0xFFA25D:  
    Serial.println(" CH-            "); 
    break;

  case 0xFF629D:  
    Serial.println(" CH             "); 
    break;

  case 0xFFE21D:  
    Serial.println(" CH+            "); 
    break;

  case 0xFF22DD:  
    {
    Serial.println(" PREV           "); 
    dim=128;
    }
    break;

  case 0xFF02FD:  
    {
    Serial.println(" NEXT           "); 
    dim=0;
    }
    break;

  case 0xFFC23D:  
    Serial.println(" PLAY/PAUSE     "); 
    break;

  case 0xFFE01F:  
    {
    Serial.println(" VOL-           "); 
    if (dim<127)  
   {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
    }
    }
    break;

  case 0xFFA857:  
    {
    Serial.println(" VOL+           "); 
      {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
   }
    break;

  case 0xFF906F:  
    Serial.println(" EQ             "); 
    break;

  case 0xFF6897:  
    {
    Serial.println(" 0              "); 
 //   analogWrite(ledr, 0); 
 //   analogWrite(leda, 0); 
 //   analogWrite(ledv, 0); 
     }
    break;

  case 0xFF9867:  
    Serial.println(" 100+           "); 
    break;

  case 0xFFB04F:  
    Serial.println(" 200+           "); 
    break;

  case 0xFF30CF:  
    {
    Serial.println(" 1              "); 
 //   analogWrite(leda, 255);
    }
    break;

  case 0xFF18E7:  
    {  
    Serial.println(" 2              "); 
 //   analogWrite(ledv, 255);
    }
    break;

  case 0xFF7A85:  
    {
    Serial.println(" 3              "); 
 //   analogWrite(ledr, 255);
    }
    break;

  case 0xFF10EF:  
    {
    Serial.println(" 4              "); 
 //   analogWrite(leda, 122);
    }
    break;

  case 0xFF38C7:  
    {
    Serial.println(" 5              "); 
 //   analogWrite(ledv, 122);
    }
    break;

  case 0xFF5AA5:  
    {
    Serial.println(" 6              "); 
 //   analogWrite(ledr, 122);
    }
    break;

  case 0xFF42BD:  
    {
    Serial.println(" 7              "); 
 //   analogWrite(leda, 0);
    }
    break;

  case 0xFF4AB5:  
    {
    Serial.println(" 8              "); 
 //   analogWrite(ledv, 0);
    }
    break;

  case 0xFF52AD:  
    {
    Serial.println(" 9              "); 
 //   analogWrite(ledr, 0);
    }
    break;

  default: 
    Serial.println(" other button   ");

  }

}

void blustuf()
{
    incomingByte = Serial.read(); // read byte
    if(incomingByte == '0') {
       }
    if(incomingByte == '1') {
    }
    if(incomingByte == '2') {
    }
    if(incomingByte == '3') {
    }
    if(incomingByte == '4') {
    }
    if(incomingByte == '5') {
    }
    if(incomingByte == '6') {
    }
    if(incomingByte == '7') {
    }
  if(incomingByte == 'a') {   //step up
  if (dim<127)  
   {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; 
    }
    }  
  }
  
  if(incomingByte == 's') {  //step down
  if (dim>5)  
   {
    dim = dim - pas;
    if (dim<0) 
    {
      dim=0; 
    }
    }  
  }
 
  if(incomingByte == 'w') {  // power is 100%
    dim=0; 
  }
  if(incomingByte == 'z') {  // power is 0% (off)
    dim=128; 
  }
}

void stelute()
{
if (dim2<1) lcd.print("----------------");
else 
if (dim2<9) lcd.print("*---------------");
else 
if (dim2<17) lcd.print("-*--------------");
else
if (dim2<25) lcd.print("--*-------------");
else
if (dim2<33) lcd.print("---*------------");
else
if (dim2<41) lcd.print("----*-----------");
else
if (dim2<49) lcd.print("-----*----------");
else
if (dim2<57) lcd.print("------*---------");
else
if (dim2<65) lcd.print("-------*--------");
else
if (dim2<73) lcd.print("--------*-------");
else
if (dim2<81) lcd.print("---------*------");
else
if (dim2<89) lcd.print("----------*-----");
else
if (dim2<97) lcd.print("-----------*----");
else
if (dim2<105) lcd.print("------------*---");
else
if (dim2<113) lcd.print("-------------*--");
else
if (dim2<121) lcd.print("--------------*-");
else
if (dim2>127) lcd.print("---------------*");
}


void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);

 if (Serial.available() > 0) blustuf();  // if bluetooth is present

 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    

 
// remote
   if (irrecv.decode(&results)) // have we received an IR signal?
  {
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  

 delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100*(128-dim)/128);
 lcd.print("%    "); // print a text

lcd.setCursor(0, 1); // put cursor at colon 0 and row 1

dim2=128-dim; // variable use for graphics
stelute();
}

   Am facut si 2 filmulete (primul in romana si al doilea in engleza):
ac light dimmer with Arduino (XXI)
ac light dimmer with Arduino (XXII)

joi, 23 ianuarie 2014

Variator de tensiune pentru bec cu Arduino (VI)

   Am completat variatorul de tensiune in 16 trepte cu 2 butoane si afisaj alfanumeric LCD 16x2 cu un sistem de comanda de la distanta in infrarosu, folosind o telecomanda pentru mp3 player de masina cu codare NEC, pentru a stine, scadea/creste intensitatea si aprinde la maxim un bec cu incandescenta.
   Partea de sketch este o combinatie a celor prezentate in articolele Telecomanda infrarosu HX1838 si Variator de tensiune pentru bec cu Arduino (V):
/*
AC Light Control
 Updated by Robert Twomey <rtwomey@u.washington.edu>
 Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445 
 and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
 adapted sketch by niq_ro from
 http://www.tehnic.go.ro 
 http://www.niqro.3x.ro 
 http://nicuflorica.blogspot.com 

IR Remote Kit Test
 Uses YourDuino.com IR Infrared Remote Control Kit 2
 http://arduino-direct.com/sunshop/index.php?l=product_detail&p=153
 based on code by Ken Shirriff - http://arcfn.com1
 Get Library at: https://github.com/shirriff/Arduino-IRremote
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/

#include "IRremote.h"
/*-----( Declare Constants )-----*/
int receiver = 7; // pin 1 of IR receiver to Arduino digital pin 7
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/

#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

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 = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m5 (23.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

void setup() {  // Begin setup
Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  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);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

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                     
    }                                
  }    
}                                      

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received

// describing Car MP3 IR codes 
{
  switch(results.value)
  {
/*
  case 0xFFA25D:  
    Serial.println(" CH-            "); 
    break;

  case 0xFF629D:  
    Serial.println(" CH             "); 
    break;

  case 0xFFE21D:  
    Serial.println(" CH+            "); 
    break;
*/
  case 0xFF22DD:  
    {
    Serial.println(" PREV           "); 
    dim=128;
    }
    break;

  case 0xFF02FD:  
    {
    Serial.println(" NEXT           "); 
    dim=0;
    }
    break;

  case 0xFFC23D:  
    Serial.println(" PLAY/PAUSE     "); 
    break;

  case 0xFFE01F:  
    {
    Serial.println(" VOL-           "); 
    if (dim<127)  
   {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
    }
    }
    break;

  case 0xFFA857:  
    {
    Serial.println(" VOL+           "); 
      {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
   }
    break;

  case 0xFF906F:  
    Serial.println(" EQ             "); 
    break;

  case 0xFF6897:  
    {
    Serial.println(" 0              "); 
 //   analogWrite(ledr, 0); 
 //   analogWrite(leda, 0); 
 //   analogWrite(ledv, 0); 
     }
    break;

  case 0xFF9867:  
    Serial.println(" 100+           "); 
    break;

  case 0xFFB04F:  
    Serial.println(" 200+           "); 
    break;

  case 0xFF30CF:  
    {
    Serial.println(" 1              "); 
 //   analogWrite(leda, 255);
    }
    break;

  case 0xFF18E7:  
    {  
    Serial.println(" 2              "); 
 //   analogWrite(ledv, 255);
    }
    break;

  case 0xFF7A85:  
    {
    Serial.println(" 3              "); 
 //   analogWrite(ledr, 255);
    }
    break;

  case 0xFF10EF:  
    {
    Serial.println(" 4              "); 
 //   analogWrite(leda, 122);
    }
    break;

  case 0xFF38C7:  
    {
    Serial.println(" 5              "); 
 //   analogWrite(ledv, 122);
    }
    break;

  case 0xFF5AA5:  
    {
    Serial.println(" 6              "); 
 //   analogWrite(ledr, 122);
    }
    break;

  case 0xFF42BD:  
    {
    Serial.println(" 7              "); 
 //   analogWrite(leda, 0);
    }
    break;

  case 0xFF4AB5:  
    {
    Serial.println(" 8              "); 
 //   analogWrite(ledv, 0);
    }
    break;

  case 0xFF52AD:  
    {
    Serial.println(" 9              "); 
 //   analogWrite(ledr, 0);
    }
    break;

  default: 
    Serial.println(" other button   ");

  }
}

void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
  
 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    
 
// remote
   if (irrecv.decode(&results)) // have we received an IR signal?
  {
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  

          
 
 delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100*(128-dim)/128);
 lcd.print("%    "); // print a text
/*
 lcd.setCursor(1, 1); // put cursor at colon 1 and row 1
 lcd.print("dim. level="); // print a text
 lcd.print(dim);
 lcd.print("  "); // print a text
*/
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1

dim2=128-dim; // variable use for graphics

if (dim2<1) lcd.print("----------------");
else 
if (dim2<9) lcd.print("*---------------");
else 
if (dim2<17) lcd.print("-*--------------");
else
if (dim2<25) lcd.print("--*-------------");
else
if (dim2<33) lcd.print("---*------------");
else
if (dim2<41) lcd.print("----*-----------");
else
if (dim2<49) lcd.print("-----*----------");
else
if (dim2<57) lcd.print("------*---------");
else
if (dim2<65) lcd.print("-------*--------");
else
if (dim2<73) lcd.print("--------*-------");
else
if (dim2<81) lcd.print("---------*------");
else
if (dim2<89) lcd.print("----------*-----");
else
if (dim2<97) lcd.print("-----------*----");
else
if (dim2<105) lcd.print("------------*---");
else
if (dim2<113) lcd.print("-------------*--");
else
if (dim2<121) lcd.print("--------------*-");
else
if (dim2>127) lcd.print("---------------*");
}
   Filmuletele care prezinta modulde comportare amontajelor sunt:
ac light dimmer with Arduino (XIX)
ac light dimmer with Arduino (XX)
24.01.2014
   Schema de conectare a modulelor este:
   Schema modulului de detectare a trecerii prin zero a tensiunii retelei si partea de comanda efectiva a becului este:

miercuri, 22 ianuarie 2014

Variator de tensiune pentru bec cu Arduino (V)

   Am revenit la partea de variator de tensiune pentru bec cu incandescenta,pana nu dispar de tot de pe piata... de data asta am pus si un afisaj LCD alfanumeric 1602 (16 coloane si 2 randuri), 2 butoane fara retinere pentru creste si scadere intensitate luminoasa si 16 trepte ...
   Partea cea mai complicata si cea mai periculoasa, care detecteaza trecerea prin zero a tensiunii retelei si, care comanda triacul, se gaseste in articolul Variator de tensiune pentru bec folosind un Arduino:
   In articolele Variator de tensiune pentru un bec cu Arduino (II)Variator de tensiune pentru bec cu Arduino (III) si Variator de tensiune pentru bec cu Arduino (IV) am prezentat mai multe experimente, iar schema de baza ar fi ca cea de mai jos, fara LED-ul RGB:
   Eu am conectat si afisajul LCD la pinii 8..13 obtinand:
- bec stins (0%):
- treapta 1 (6%):
- treapta 2-a (13%):
- treapta 3-a (19%):
- treapta 4-a (25%):
- treapta 5-a (31%):
- treapta 6-a (38%):
- treapta 7-a (44%):
- treapta 8-a (50%):
- treapta 9-a (57%):
- treapta 10-a (63%):
- treapta 11-a (69%):
- treapta 12-a (75%):
- treapta 13-a (82%):
- treapta 14-a (88%):
- treapta 15-a (94%):
- treapta 16-a (100%), adica maxim:
   Si sa "raman in continuare om serios" va arat si programiorul folosit / sketch-ul):
/*
AC Light Control
 Updated by Robert Twomey <rtwomey@u.washington.edu>
 Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445 
 and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
 adapted sketch by niq_ro from
 http://www.tehnic.go.ro 
 http://www.niqro.3x.ro 
 http://nicuflorica.blogspot.com 
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/

#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

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 = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m3 (22.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

 
void setup() {  // Begin setup
  Serial.begin(9600);   
  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  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);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

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 loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
  
 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=127;
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=1;
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    
           

  dim2 = 255-2*dim;
  if (dim2<0)
  {
    dim2 = 0;
  }

  Serial.print("dim=");
  Serial.print(dim);

  Serial.print("     dim2=");
  Serial.print(dim2);
  Serial.print("     dim1=");
  Serial.print(2*dim);
  Serial.print('\n');
  delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100-100*(255-dim2)/255);
 lcd.print("%    "); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("dim. level="); // print a text
 lcd.print(dim);
 lcd.print("  "); // print a text
}
   Am facut si 2 filmulete:
ac light dimmer with Arduino (XVII)
ac light dimmer with Arduino (XVIII)
23.01.2014
   Deoarece am constatat ca la tastarea pentru cresterea sau scaderea intensitatii luminoase, mai apar erori la numarul minim sau maxim, am corectat sketch-ul in 2 locuri:
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
   respectiv:
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }

24.01.2014
   Am desenat si schema de comectare completa: