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.htmlsketch for test is made by niq_ro from http://www.tehnic.go.rohttp://nicuflorica.blogspot.ro/si http://arduinotehniq.blogspot.com/ */int ledPin = 9; // LED connected to digital pin 9voidsetup() {
// initialize serial:Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
voidloop() {
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);
}
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 fromhttp://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.comIR Remote Kit Test Uses YourDuino.com IR Infrared Remote Control Kit 2http://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-IRremoteBluetooth:// adapted sketch from http://english.cxem.net/arduino/arduino4.php*/
#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602LiquidCrystal 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 zeroint AC_pin = 3; // Output to Opto Triacint buton1 = 4; // first button at pin 4int buton2 = 5; // second button at pin 5int dim2 = 0; // led controlint dim = 128; // Dimming level (0-128) 0 = on, 128 = 0ffint 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 & LCD1602int freqStep = 75; // This is the delay-per-brightness step in microseconds.char incomingByte; // incoming data from serial 9bluetooth)voidsetup() { // Begin setupSerial.begin(9600); // initialization
irrecv.enableIRIn(); // Start the IR receiver (classic remote)pinMode(buton1, INPUT); // set buton1 pin as inputpinMode(buton2, INPUT); // set buton1 pin as inputpinMode(AC_pin, OUTPUT); // Set the Triac pin as outputattachInterrupt(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 textdelay (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 textdelay (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 timevoid 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 byteif(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 upif (dim<127)
{
dim = dim + pas;
if (dim>127)
{
dim=128;
}
}
}
if(incomingByte == 's') { //step downif (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("----------------");
elseif (dim2<9) lcd.print("*---------------");
elseif (dim2<17) lcd.print("-*--------------");
elseif (dim2<25) lcd.print("--*-------------");
elseif (dim2<33) lcd.print("---*------------");
elseif (dim2<41) lcd.print("----*-----------");
elseif (dim2<49) lcd.print("-----*----------");
elseif (dim2<57) lcd.print("------*---------");
elseif (dim2<65) lcd.print("-------*--------");
elseif (dim2<73) lcd.print("--------*-------");
elseif (dim2<81) lcd.print("---------*------");
elseif (dim2<89) lcd.print("----------*-----");
elseif (dim2<97) lcd.print("-----------*----");
elseif (dim2<105) lcd.print("------------*---");
elseif (dim2<113) lcd.print("-------------*--");
elseif (dim2<121) lcd.print("--------------*-");
elseif (dim2>127) lcd.print("---------------*");
}
voidloop() {
digitalWrite(buton1, HIGH);
digitalWrite(buton2, HIGH);
if (Serial.available() > 0) blustuf(); // if bluetooth is presentif (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... // remoteif (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 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.
/*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 fromhttp://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.comIR Remote Kit Test Uses YourDuino.com IR Infrared Remote Control Kit 2http://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 1602LiquidCrystal 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 zeroint AC_pin = 3; // Output to Opto Triacint buton1 = 4; // first button at pin 4int buton2 = 5; // second button at pin 5int dim2 = 0; // led controlint dim = 128; // Dimming level (0-128) 0 = on, 128 = 0ffint 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 & LCD1602int freqStep = 75; // This is the delay-per-brightness step in microseconds.voidsetup() { // Begin setupSerial.begin(9600);
irrecv.enableIRIn(); // Start the receiverpinMode(buton1, INPUT); // set buton1 pin as inputpinMode(buton2, INPUT); // set buton1 pin as inputpinMode(AC_pin, OUTPUT); // Set the Triac pin as outputattachInterrupt(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 textdelay (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 textdelay (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 timevoid 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 ");
}
}
voidloop() {
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... // remoteif (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 graphicsif (dim2<1) lcd.print("----------------");
elseif (dim2<9) lcd.print("*---------------");
elseif (dim2<17) lcd.print("-*--------------");
elseif (dim2<25) lcd.print("--*-------------");
elseif (dim2<33) lcd.print("---*------------");
elseif (dim2<41) lcd.print("----*-----------");
elseif (dim2<49) lcd.print("-----*----------");
elseif (dim2<57) lcd.print("------*---------");
elseif (dim2<65) lcd.print("-------*--------");
elseif (dim2<73) lcd.print("--------*-------");
elseif (dim2<81) lcd.print("---------*------");
elseif (dim2<89) lcd.print("----------*-----");
elseif (dim2<97) lcd.print("-----------*----");
elseif (dim2<105) lcd.print("------------*---");
elseif (dim2<113) lcd.print("-------------*--");
elseif (dim2<121) lcd.print("--------------*-");
elseif (dim2>127) lcd.print("---------------*");
}
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:
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 fromhttp://www.tehnic.go.rohttp://www.niqro.3x.rohttp://nicuflorica.blogspot.com*/
#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602LiquidCrystal 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 zeroint AC_pin = 3; // Output to Opto Triacint buton1 = 4; // first button at pin 4int buton2 = 5; // second button at pin 5int dim2 = 0; // led controlint dim = 128; // Dimming level (0-128) 0 = on, 128 = 0ffint 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 & LCD1602int freqStep = 75; // This is the delay-per-brightness step in microseconds.voidsetup() { // Begin setupSerial.begin(9600);
pinMode(buton1, INPUT); // set buton1 pin as inputpinMode(buton2, INPUT); // set buton1 pin as inputpinMode(AC_pin, OUTPUT); // Set the Triac pin as outputattachInterrupt(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 textdelay (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 textdelay (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 timevoid 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
}
}
}
voidloop() {
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
}
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: