arduino ac dimmer aansturen pwm?
33 berichten
• Pagina 3 van 4 • 1, 2, 3, 4
Re: arduino ac dimmer aansturen pwm?
pwmVal = 0 dient om de variabele te initialiseren, dus van een begin waarde te voorzien. Voor de 2de dimmer moet je een 2de "PWM" bediening inbouwen.
Je kunt de 2de interrupt ingang voor de 2de dimmer gebruiken alleen moet dan de uitgang van de eerste dimmer digitale pin 3 op een andere digitale pin zetten.
Verder moet je een 2de dimming variabele bij maken
in de setup functie deze regel toevoegen:
attachInterrupt(1, zero_crosss_int2, RISING);
De 2de interrupt service routine toevoegen:
en je moet voor de dimming2 waarde te wijzigen nog een 2de "PWM" mogelijkheid toevoegen en een 2de set up en down toetsen om dimming2 te veranderen. Met de toetsen zou je kunnen beginnen en als dat werkt kun je de 2de "PWM" toevoegen. Of om de 2de dimmer te testen eerst de "PWM" van de eerste dimmer gebruiken, door:
tijdelijk aan te passen naar:
Je kunt de 2de interrupt ingang voor de 2de dimmer gebruiken alleen moet dan de uitgang van de eerste dimmer digitale pin 3 op een andere digitale pin zetten.
Verder moet je een 2de dimming variabele bij maken
- Code: Alles selecteren
int dimming2 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int AC_LOAD = 5; // Op vrije digitale pin zetten
int AC_LOAD2 = 6; // Op vrije digitale pin zetten
in de setup functie deze regel toevoegen:
attachInterrupt(1, zero_crosss_int2, RISING);
De 2de interrupt service routine toevoegen:
- Code: Alles selecteren
void zero_crosss_int2() // function to be fired at the zero crossing to dim the light
{ // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
int dimtime = (75*dimming2); // (10000us - 10us) / 128 = 75 (Approx)
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD2, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay
digitalWrite(AC_LOAD2, LOW); // triac Off
}
en je moet voor de dimming2 waarde te wijzigen nog een 2de "PWM" mogelijkheid toevoegen en een 2de set up en down toetsen om dimming2 te veranderen. Met de toetsen zou je kunnen beginnen en als dat werkt kun je de 2de "PWM" toevoegen. Of om de 2de dimmer te testen eerst de "PWM" van de eerste dimmer gebruiken, door:
- Code: Alles selecteren
dimming = (pwmVal>>1); // dimming = pwm / 2;
tijdelijk aan te passen naar:
- Code: Alles selecteren
dimming2 = (pwmVal>>1); // dimming = pwm / 2;
Advertisement
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: arduino ac dimmer aansturen pwm?
I denk toch dat je beter 1 zerocrossing interrupt routine kan maken, omdat twee losse interrupt routines toch practisch tegelijkertijd aangeroepen zullen worden, en aangezien ze 'dedicated' zijn (delays) zal er maar 1 goed afgehandeld worden.
Het volgende zou kunnen werken, maar moet beter kunnen denk ik.
we kijken dus eerst welke triac het eerst afgevuurt moet worden en doen die als eerste en daarna de twee,
ik denk dat het stukje delaymicrosec();digitalWrite(AC_LOAD2).... wel aan het eind gezet mogen worden, enig verschil is dat de triac langer afgevuurt wordt en dat is geen probleem dacht ik.
Zou je krijgen:
Het volgende zou kunnen werken, maar moet beter kunnen denk ik.
- Code: Alles selecteren
void zero_cross_int()
{
// knip
if ( dimtime1 > dimtime2)
{ delayMicroseconds(dimtime2);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
delayMicroseconds( dimtime1 - dimtime2);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD1, LOW);
}
else
{
// zelfde maar dan andersom eerst 1 en dan 2
}
}
we kijken dus eerst welke triac het eerst afgevuurt moet worden en doen die als eerste en daarna de twee,
ik denk dat het stukje delaymicrosec();digitalWrite(AC_LOAD2).... wel aan het eind gezet mogen worden, enig verschil is dat de triac langer afgevuurt wordt en dat is geen probleem dacht ik.
Zou je krijgen:
- Code: Alles selecteren
if ( dimtime1 > dimtime2)
{ delayMicroseconds(dimtime2);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds( dimtime1 - dimtime2);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
digitalWrite(AC_LOAD1, LOW);
}
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate
Re: arduino ac dimmer aansturen pwm?
hoi mensen,
terug van weggeweest, na de geboorte van een mooie dochter nu weer wat tijd voor de hobby.
uiteraard weer aardig wat tijd besteed aan me dimmer.
inmiddels 2 dimmer functie op me arduino, maar heb nu alleen nog wat problemen met dat de lampen.
Ze lijken ng iets te flikkeren, bij 1 dimmer op de arduino is het goed, bij 2 flikkerd hij iets... kan de arduino het niet aan?
is mijn programmering te zwaar?
zou er misschien iemand eroverheen kunnen kijken?
groet danny
#include <SPI.h> // voor Arduino versie 0018 en hoger
#include <EthernetUdp.h>
#include <Ethernet.h>
////////// NETWORK INFO ////////////////
byte mac[] = { 0x90, 0xa2, 0xda, 0x00, 0xf9, 0x64 }; // mac adres van de ethernet shield
byte ip[] = { 192, 168, 1, 72 }; // het ip adres dat je aan je arduio wilt geven
unsigned int localPort = 7777; // de poort die je wilt gebruiken
IPAddress iPhoneIP(192, 168, 1, 71); //ip adres van je iphone/ipad/ipod
unsigned int iPhonePort = 7777; // poort van de iphone/ipad/ipod (zelfde als localport)
///////////////// UDP Variables //////////////////
char packBuff[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
///////// Pin verklaring /////////////////
int LED_Pin = 6; // maakt LED_Pin van Pin 6
int dim_up = 22; // dim up
int dim_down = 23; //dim down
int AC_LOAD = 14; // Output to Opto Triac pin
int AC_LOAD2 = 15; // Output to Opto Triac pin
///////// Variabelle //
int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int dimming2 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int pwmVal = 2; // Integer that will hold our PWM values for later use
int pwmVal2 = 3; // Integer that will hold our PWM values for later use
int buttonState = 0;
int teller=0;
EthernetUDP Udp;
//-------------------------------------------------------------------------
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
pinMode(LED_Pin, OUTPUT);
pinMode(AC_LOAD, OUTPUT);
pinMode(AC_LOAD2, OUTPUT);
pinMode(dim_up, INPUT);
pinMode(dim_down, INPUT);
//attachInterrupt(0, zero_crosss_int, RISING);
//attachInterrupt(1, zero_crosss_int2, RISING);
attachInterrupt(1, test, RISING);
}
void test()
{
if (teller == 0)
{
zero_crosss_int();
teller=1;
}
else
{
zero_crosss_int2();
teller=0;
}
}
void test2()
{
zero_crosss_int();
zero_crosss_int2();
}
//-------------------------------------------------------------------------
void zero_crosss_int()
{
//Serial.println("1");
int dimtime = (75*dimming); // (10000us - 10us) / 128 = 75 (Approx)
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay
digitalWrite(AC_LOAD, LOW); // triac Off
//delayMicroseconds(10); // triac On propogation delay
}
void zero_crosss_int2()
{
int dimtime2 = (75*dimming2); // (10000us - 10us) / 128 = 75 (Approx)
delayMicroseconds(dimtime2); // Off cycle
digitalWrite(AC_LOAD2, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay
digitalWrite(AC_LOAD2, LOW); // triac Off
//delayMicroseconds(10); // triac On propogation delay
}
//-------------------------------------------------------------------------
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_up);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
Serial.println("button higher");
dimming -= 2;
if (dimming < 20) dimming = 20;
}
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_down);
if (buttonState == HIGH) {
Serial.println("button lower");
// turn higher on:
dimming += 2;
if (dimming > 112) dimming = 125;
}
int packetSize = Udp.parsePacket();
if(packetSize)
{ packetSize = packetSize - 8; // subtract 8 byte header
Udp.read(packBuff,UDP_TX_PACKET_MAX_SIZE);
//Serial.println("buffer: "); Serial.println(packBuff);
if (packBuff[0] = 'M' && packBuff[1]=='P' && packBuff[2]=='W') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal > 250) pwmVal= 250; // limit
if (pwmVal < 15) pwmVal= 15; // limit
dimming = (pwmVal>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 1 is: "); Serial.println(dimming); // Write notification
}
if (packBuff[0] = 'A' && packBuff[1]=='B' && packBuff[2]=='C') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal2 = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal2 > 250) pwmVal2= 250; // limit
if (pwmVal2 < 15) pwmVal2= 15; // limit
dimming2 = (pwmVal2>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 2 is: "); Serial.println(dimming2); // Write notification
}
/*
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='H') // If message "P6H", set LED_Pin (6) HIGH
{
digitalWrite(LED_Pin,HIGH); // Turn on LED_Pin
Serial.println("LED ON"); // Write notification
Udp.beginPacket(iPhoneIP,iPhonePort);
Udp.write("LED 6 is ON"); // Send Message back to iPhone
Udp.endPacket();
}
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='L') // If message "P6L", set LED_Pin (6) LOW
{
digitalWrite(LED_Pin,LOW); // Turn off LED_Pin
Serial.println("LED OFF"); // Write notification
Udp.beginPacket(iPhoneIP, iPhonePort);
Udp.write("LED 6 is OFF"); // Send Message back to iPhone
Udp.endPacket();
}*/
delay(20);
}}}
terug van weggeweest, na de geboorte van een mooie dochter nu weer wat tijd voor de hobby.
uiteraard weer aardig wat tijd besteed aan me dimmer.
inmiddels 2 dimmer functie op me arduino, maar heb nu alleen nog wat problemen met dat de lampen.
Ze lijken ng iets te flikkeren, bij 1 dimmer op de arduino is het goed, bij 2 flikkerd hij iets... kan de arduino het niet aan?
is mijn programmering te zwaar?
zou er misschien iemand eroverheen kunnen kijken?
groet danny
#include <SPI.h> // voor Arduino versie 0018 en hoger
#include <EthernetUdp.h>
#include <Ethernet.h>
////////// NETWORK INFO ////////////////
byte mac[] = { 0x90, 0xa2, 0xda, 0x00, 0xf9, 0x64 }; // mac adres van de ethernet shield
byte ip[] = { 192, 168, 1, 72 }; // het ip adres dat je aan je arduio wilt geven
unsigned int localPort = 7777; // de poort die je wilt gebruiken
IPAddress iPhoneIP(192, 168, 1, 71); //ip adres van je iphone/ipad/ipod
unsigned int iPhonePort = 7777; // poort van de iphone/ipad/ipod (zelfde als localport)
///////////////// UDP Variables //////////////////
char packBuff[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
///////// Pin verklaring /////////////////
int LED_Pin = 6; // maakt LED_Pin van Pin 6
int dim_up = 22; // dim up
int dim_down = 23; //dim down
int AC_LOAD = 14; // Output to Opto Triac pin
int AC_LOAD2 = 15; // Output to Opto Triac pin
///////// Variabelle //
int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int dimming2 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int pwmVal = 2; // Integer that will hold our PWM values for later use
int pwmVal2 = 3; // Integer that will hold our PWM values for later use
int buttonState = 0;
int teller=0;
EthernetUDP Udp;
//-------------------------------------------------------------------------
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
pinMode(LED_Pin, OUTPUT);
pinMode(AC_LOAD, OUTPUT);
pinMode(AC_LOAD2, OUTPUT);
pinMode(dim_up, INPUT);
pinMode(dim_down, INPUT);
//attachInterrupt(0, zero_crosss_int, RISING);
//attachInterrupt(1, zero_crosss_int2, RISING);
attachInterrupt(1, test, RISING);
}
void test()
{
if (teller == 0)
{
zero_crosss_int();
teller=1;
}
else
{
zero_crosss_int2();
teller=0;
}
}
void test2()
{
zero_crosss_int();
zero_crosss_int2();
}
//-------------------------------------------------------------------------
void zero_crosss_int()
{
//Serial.println("1");
int dimtime = (75*dimming); // (10000us - 10us) / 128 = 75 (Approx)
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay
digitalWrite(AC_LOAD, LOW); // triac Off
//delayMicroseconds(10); // triac On propogation delay
}
void zero_crosss_int2()
{
int dimtime2 = (75*dimming2); // (10000us - 10us) / 128 = 75 (Approx)
delayMicroseconds(dimtime2); // Off cycle
digitalWrite(AC_LOAD2, HIGH); // triac firing
delayMicroseconds(10); // triac On propogation delay
digitalWrite(AC_LOAD2, LOW); // triac Off
//delayMicroseconds(10); // triac On propogation delay
}
//-------------------------------------------------------------------------
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_up);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
Serial.println("button higher");
dimming -= 2;
if (dimming < 20) dimming = 20;
}
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_down);
if (buttonState == HIGH) {
Serial.println("button lower");
// turn higher on:
dimming += 2;
if (dimming > 112) dimming = 125;
}
int packetSize = Udp.parsePacket();
if(packetSize)
{ packetSize = packetSize - 8; // subtract 8 byte header
Udp.read(packBuff,UDP_TX_PACKET_MAX_SIZE);
//Serial.println("buffer: "); Serial.println(packBuff);
if (packBuff[0] = 'M' && packBuff[1]=='P' && packBuff[2]=='W') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal > 250) pwmVal= 250; // limit
if (pwmVal < 15) pwmVal= 15; // limit
dimming = (pwmVal>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 1 is: "); Serial.println(dimming); // Write notification
}
if (packBuff[0] = 'A' && packBuff[1]=='B' && packBuff[2]=='C') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal2 = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal2 > 250) pwmVal2= 250; // limit
if (pwmVal2 < 15) pwmVal2= 15; // limit
dimming2 = (pwmVal2>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 2 is: "); Serial.println(dimming2); // Write notification
}
/*
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='H') // If message "P6H", set LED_Pin (6) HIGH
{
digitalWrite(LED_Pin,HIGH); // Turn on LED_Pin
Serial.println("LED ON"); // Write notification
Udp.beginPacket(iPhoneIP,iPhonePort);
Udp.write("LED 6 is ON"); // Send Message back to iPhone
Udp.endPacket();
}
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='L') // If message "P6L", set LED_Pin (6) LOW
{
digitalWrite(LED_Pin,LOW); // Turn off LED_Pin
Serial.println("LED OFF"); // Write notification
Udp.beginPacket(iPhoneIP, iPhonePort);
Udp.write("LED 6 is OFF"); // Send Message back to iPhone
Udp.endPacket();
}*/
delay(20);
}}}
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: arduino ac dimmer aansturen pwm?
Gefeliciteerd met je Dochter. en welkom terug.
Deze arduino kan je gelijk boven de wieg monteren, kan ze er al toepassingen voor dromen
Hoe werkt dat met die test(){ ? het lijkt erop dat je de interrupt voor ch1 en ch2 om-en-om aanroept , dan zou een lamp op 25hz aangestuurd worden, mischien is dat al te zien.
Heb je het stukje code uit m'n vorige bericht nog kunnen proberen waarbij beide lampen vanuit 1 interupt aangestuurd worden?. dan zouden de lampen wel met 50hz aangestuurd worden.
Deze arduino kan je gelijk boven de wieg monteren, kan ze er al toepassingen voor dromen
Hoe werkt dat met die test(){ ? het lijkt erop dat je de interrupt voor ch1 en ch2 om-en-om aanroept , dan zou een lamp op 25hz aangestuurd worden, mischien is dat al te zien.
Heb je het stukje code uit m'n vorige bericht nog kunnen proberen waarbij beide lampen vanuit 1 interupt aangestuurd worden?. dan zouden de lampen wel met 50hz aangestuurd worden.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate
Re: arduino ac dimmer aansturen pwm?
hoi,
wel even geprobeerd die erin te verwerken maar kreeg het niet werkend, leek net of die erop vast liep.
Hij begon te knipperen zodra het geladen was.
Maar zal toch op een of andere manier moeten kunnen lijkt me....
Kan ook helemaal nergens op het net iets vinden van iemand die ook zoiets heeft gemaakt of geprobeerd te maken... hi
wel een enkele dimmer maarja om nou voor elke dimmer een eigen arduino te nemen, loopt het ook zo hard op in de kosten.
Dus als iemand nog een iemand idee heeft of weet hoe ik de code erin krijg dat ze beide vanuit 1 interupt aangestuurd worden.
Groeten Danny
wel even geprobeerd die erin te verwerken maar kreeg het niet werkend, leek net of die erop vast liep.
Hij begon te knipperen zodra het geladen was.
Maar zal toch op een of andere manier moeten kunnen lijkt me....
Kan ook helemaal nergens op het net iets vinden van iemand die ook zoiets heeft gemaakt of geprobeerd te maken... hi
wel een enkele dimmer maarja om nou voor elke dimmer een eigen arduino te nemen, loopt het ook zo hard op in de kosten.
Dus als iemand nog een iemand idee heeft of weet hoe ik de code erin krijg dat ze beide vanuit 1 interupt aangestuurd worden.
Groeten Danny
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: arduino ac dimmer aansturen pwm?
humz, ik zie niet direct waarom het niet zou werken. als je de code logisch doorloopt doet hettoch wat we willen ?.
Heb je iets van een oscilloscoop om de afvuur pulsen/nuldoorgang te bekijken ?.
Mischien is het ook wat beter om dimtime1, dimtime2 buiten de interrupt al te berekenen, want twee multiply instructies duurt mischien toch wel aardig wat tijd.
- Code: Alles selecteren
void zero_cross_int()
{
int dimtime1 = (75 * dimming); // (10000us - 10us) / 128 = 75 (Approx)
int dimtime2 = (75 * dimming2); // (10000us - 10us) / 128 = 75 (Approx)
if ( dimtime1 > dimtime2)
{ delayMicroseconds(dimtime2);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
delayMicroseconds( dimtime1 - dimtime2);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD1, LOW);
}
else
{ delayMicroseconds(dimtime1);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD1, LOW);
delayMicroseconds( dimtime2 - dimtime1);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
}
}
Heb je iets van een oscilloscoop om de afvuur pulsen/nuldoorgang te bekijken ?.
Mischien is het ook wat beter om dimtime1, dimtime2 buiten de interrupt al te berekenen, want twee multiply instructies duurt mischien toch wel aardig wat tijd.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate
Re: arduino ac dimmer aansturen pwm?
Hoi,
Nee heb geen oscilloscoop.
k heb nu je stukje in mijn code zitten maar dan blijf hij dus knipperen...
weet niet waar ik het zoeken moet.
Nee heb geen oscilloscoop.
k heb nu je stukje in mijn code zitten maar dan blijf hij dus knipperen...
weet niet waar ik het zoeken moet.
- Code: Alles selecteren
#include <SPI.h> // voor Arduino versie 0018 en hoger
#include <EthernetUdp.h>
#include <Ethernet.h>
////////// NETWORK INFO ////////////////
byte mac[] = { 0x90, 0xa2, 0xda, 0x00, 0xf9, 0x64 }; // mac adres van de ethernet shield
byte ip[] = { 192, 168, 1, 72 }; // het ip adres dat je aan je arduio wilt geven
unsigned int localPort = 7777; // de poort die je wilt gebruiken
IPAddress iPhoneIP(192, 168, 1, 71); //ip adres van je iphone/ipad/ipod
unsigned int iPhonePort = 7777; // poort van de iphone/ipad/ipod (zelfde als localport)
///////////////// UDP Variables //////////////////
char packBuff[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
///////// Pin verklaring /////////////////
int LED_Pin = 6; // maakt LED_Pin van Pin 6
int dim_up = 22; // dim up
int dim_down = 23; //dim down
int AC_LOAD = 14; // Output to Opto Triac pin
int AC_LOAD2 = 15; // Output to Opto Triac pin
///////// Variabelle //
int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int dimming2 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int pwmVal = 2; // Integer that will hold our PWM values for later use
int pwmVal2 = 3; // Integer that will hold our PWM values for later use
int buttonState = 0;
int teller=0;
EthernetUDP Udp;
//-------------------------------------------------------------------------
void setup() {
Ethernet.begin(mac,ip);
Udp.begin(localPort);
Serial.begin(9600);
pinMode(LED_Pin, OUTPUT);
pinMode(AC_LOAD, OUTPUT);
pinMode(AC_LOAD2, OUTPUT);
pinMode(dim_up, INPUT);
pinMode(dim_down, INPUT);
attachInterrupt(0, zero_crosss_int, RISING);
}
void zero_crosss_int()
{
int dimtime1 = (75 * dimming); // (10000us - 10us) / 128 = 75 (Approx)
int dimtime2 = (75 * dimming2); // (10000us - 10us) / 128 = 75 (Approx)
if ( dimtime1 > dimtime2)
{ delayMicroseconds(dimtime2);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
delayMicroseconds( dimtime1 - dimtime2);
digitalWrite(AC_LOAD, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD, LOW);
}
else
{ delayMicroseconds(dimtime1);
digitalWrite(AC_LOAD, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD, LOW);
delayMicroseconds( dimtime2 - dimtime1);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
}
}
//-------------------------------------------------------------------------
void loop()
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_up);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
Serial.println("button higher");
dimming -= 2;
if (dimming < 20) dimming = 20;
}
{
// read the state of the pushbutton value:
buttonState = digitalRead(dim_down);
if (buttonState == HIGH) {
Serial.println("button lower");
// turn higher on:
dimming += 2;
if (dimming > 112) dimming = 125;
}
int packetSize = Udp.parsePacket();
if(packetSize)
{ packetSize = packetSize - 8; // subtract 8 byte header
Udp.read(packBuff,UDP_TX_PACKET_MAX_SIZE);
//Serial.println("buffer: "); Serial.println(packBuff);
if (packBuff[0] = 'M' && packBuff[1]=='P' && packBuff[2]=='W') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal > 250) pwmVal= 250; // limit
if (pwmVal < 15) pwmVal= 15; // limit
dimming = (pwmVal>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 1 is: "); Serial.println(dimming); // Write notification
}
if (packBuff[0] = 'A' && packBuff[1]=='B' && packBuff[2]=='C') // Wait for "PWMXXX", use XXX as PWM value
{
pwmVal2 = (packBuff[3] - '0')*100 + (packBuff[4] - '0')*10 + (packBuff[5] - '0');
if (pwmVal2 > 250) pwmVal2= 250; // limit
if (pwmVal2 < 15) pwmVal2= 15; // limit
dimming2 = (pwmVal2>>1); // dimming = pwm / 2;
//Serial.println("Dimming Waarde 2 is: "); Serial.println(dimming2); // Write notification
}
/*
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='H') // If message "P6H", set LED_Pin (6) HIGH
{
digitalWrite(LED_Pin,HIGH); // Turn on LED_Pin
Serial.println("LED ON"); // Write notification
Udp.beginPacket(iPhoneIP,iPhonePort);
Udp.write("LED 6 is ON"); // Send Message back to iPhone
Udp.endPacket();
}
else if (packBuff[0] = 'P' && packBuff[1]=='6' && packBuff[2]=='L') // If message "P6L", set LED_Pin (6) LOW
{
digitalWrite(LED_Pin,LOW); // Turn off LED_Pin
Serial.println("LED OFF"); // Write notification
Udp.beginPacket(iPhoneIP, iPhonePort);
Udp.write("LED 6 is OFF"); // Send Message back to iPhone
Udp.endPacket();
}*/
delay(20);
}}}
Re: arduino ac dimmer aansturen pwm?
zodra ik 1 van de 2 los haal op de interrupt pinnen werkt degene die er dan nog op zit... goed, ze zitten elkaar dus duidelijk in de weg...
- astrofrostbyte
- Berichten: 229
- Geregistreerd: 20 Jan 2013, 12:01
Re: arduino ac dimmer aansturen pwm?
Dat is raar want er wordt maar 1 interupt 'geattached' die andere doet helemaal niets.
Ander puntje is dat er alleen op rising flank wordt geinterrupt, moet dat niet beide zijn 'change' zodat de positieven EN negatieve 'bult' van de sinus aangesneden worden?.
ik zal eens kijken of ik van de week nog ff tijd vindt, zal ik ff testen mbv functiegenerator op 50hz.
Zal iets van de volgende gestripte code gebruiken:
Ander puntje is dat er alleen op rising flank wordt geinterrupt, moet dat niet beide zijn 'change' zodat de positieven EN negatieve 'bult' van de sinus aangesneden worden?.
ik zal eens kijken of ik van de week nog ff tijd vindt, zal ik ff testen mbv functiegenerator op 50hz.
Zal iets van de volgende gestripte code gebruiken:
- Code: Alles selecteren
int LED_Pin = 6; // maakt LED_Pin van Pin 6
int AC_LOAD1 = 14; // Output to Opto Triac pin
int AC_LOAD2 = 15; // Output to Opto Triac pin
int dimming1 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
int dimming2 = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
//-------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
pinMode(LED_Pin, OUTPUT);
pinMode(AC_LOAD1, OUTPUT);
pinMode(AC_LOAD2, OUTPUT);
attachInterrupt(0, zero_crosss_int, RISING);
}
//-------------------------------------------------------------------------
void zero_crosss_int()
{ digitalWrite(LED_Pin, HIGH);
int dimtime1 = (75 * dimming1); // (10000us - 10us) / 128 = 75 (Approx)
int dimtime2 = (75 * dimming2); // (10000us - 10us) / 128 = 75 (Approx)
if ( dimtime1 > dimtime2)
{ delayMicroseconds(dimtime2);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
delayMicroseconds( dimtime1 - dimtime2);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD1, LOW);
}
else
{ delayMicroseconds(dimtime1);
digitalWrite(AC_LOAD1, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD1, LOW);
delayMicroseconds( dimtime2 - dimtime1);
digitalWrite(AC_LOAD2, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD2, LOW);
}
digitalWrite(LED_Pin, LOW);
}
//-------------------------------------------------------------------------
void loop()
{
if(Serial.available())
{ int c = Serial.read();
Serial.println("Serial");
switch (c)
{
case '+' :
{ if ((dimming1 +2) > 112) dimming1 = 125;
break;
}
case '-' :
{ if ((dimming1 -2) < 20) dimming1 = 20;
break;
}
case '>' :
{ if ((dimming2 +2) > 112) dimming2 = 125;
break;
}
case '<' :
{ if ((dimming2 -2) < 20) dimming2 = 20;
break;
}
}//switch
}//fi
}//loop
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate
Re: arduino ac dimmer aansturen pwm?
Even wat aan de int dimtime veranderd, inplaats van 75*dimming nu 60*dimming, dan brand de lamp op vol vermogen en iets eronder mooi rustig maar, als je meer dimt flikkert hij weer.
(opgegeven moment zie je het niet zo goed meer hi hi hi)
(opgegeven moment zie je het niet zo goed meer hi hi hi)
33 berichten
• Pagina 3 van 4 • 1, 2, 3, 4
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten