Beste mensen.
Wij hebben thuis een zonnescherm op een elektromotor. Deze werkt heel simpel. Door de schakelaar omhoog te doen gaat hij omhoog en door de schakelaar omlaag te doen gaat hij naar beneden. Ik wil nu deze zonnescherm automatisch laten lopen door hem aan te laten sturen door een ldr, een regensensor en een arduino nano. Ik heb hiervoor ook een ontwerp gemaakt en laten maken. alles is werkend. De printplaat heeft 2 relais en de ene relais bediend de bovenste knop en het andere relais bediend de onderste knop. Wanneer het zonnescherm omhoog gaat moet relais 1 uit staan en relais 2 aan.
Wanneer het zonnescherm omlaag gaat moet relais 1 aan staan en relais 2 uit.
[attachment=0]
Dit werkt tot nu toe heel erg goed . Het zonnescherm gaat omhoog wanneer er zon is en geen regen.
Het zonnescherm gaat omlaag wanneer er regen is (en zon).
Wat nu mijn probleem is is dat de printplaat de hele dag het zonnescherm omhoog of omlaag moet houden wat betekent dat 1 relais de hele tijd is bekrachtigd. Ik wil zelf dat ze even schakelen en daarna allebei uit gaan. Want ik hoef ook maar 1 keer te drukken op de bovenste knop (500ms) en dan gaat het zonnescherm omhoog of omlaag en blijft hij ook omlaag.
dus even moet relais 1 uit staan en relais 2 uit (omhoog). En dan weer uit na 500 ms.
Ik had al een delay gezet van 500 ms en daarna allebei de relais op low gezet maar wanneer de arduino dan de ldr en de regensensor uitleest gaat hij weer de relais opnieuw aan en uit doen na 500 ms.
Hij blijft dus in een loop.
Weten jullie hiervoor een oplossing.
ik hoop dat jullie mij hiermee kunnen helpen.
Me vriendelijke groeten,
Sven
zie bijlage
int ldrValue = 0; // variable to store the value coming from the sensor
int rainValue = 0; //variable to store the value coming from the sensor
int ldrPin = A1; // select the input pin for LDR
int rainPin = A0; //select the input pint for Rainsensor
int switch_1 = 9; //select the output pin for the power switch (UP)
int switch_2 = 10; //select the output pin for the power switch (DOWN)
void setup() {
Serial.begin(9600); //sets serial port for communication
pinMode(switch_1, OUTPUT);
pinMode(switch_2, OUTPUT);
}
void loop() {
//inlezen LDR
ldrValue = analogRead(ldrPin); // read the value from the ldr sensor
Serial.println(ldrValue); //prints the values coming from the sensor on the screen
delay(100);
//inlezen Rainsensor
rainValue = analogRead(rainPin); // read the value form the rain sensor
rainValue = analogRead(rainPin); // read the value from the rain sensor
Serial.println(rainValue); //prints the values coming from the sensor to the screen
delay(100);
/* Het is de bedoeling dat het zonnescherm omlaag gaat bij geen regen en veel licht
* Het is de bedoeling dat het zonnescherm omhoog gaat bij regen
* Het is de bedoeling dat het zonnescherm omhoog gaat bij weinig licht
*/
//hoofdcode
if ((ldrValue > 700) && (rainValue > 500)){
digitalWrite(switch_1, HIGH); //zonnescherm gaat omlaag bij geen regen en veel licht
digitalWrite(switch_2, LOW);
Serial.println("zonnescherm omlaag");
}
if (rainValue <500) {
digitalWrite(switch_1, LOW); //zonnescherm gaat omhoog bij veel regen
digitalWrite(switch_2, HIGH);
Serial.println("zonnescherm omhoog, regen");
}
if (ldrValue < 500){
digitalWrite(switch_1, LOW); //zonnescherm gaat omhoog bij weinig licht
digitalWrite(switch_2, HIGH);
Serial.println("zonnescherm omhoog, te weinig licht");
}
}buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
Je code tussen code tags maakt het een stuk leesbaarder.
Waarom lees je de regensensor 2 keer in? Niet dat dit je grootste probleem is.
In je tekst zet je het ook net omgekeerd met je code. Regen is scherm naar beneden in je tekst en naar boven in je code.
Je zal moeten bijhouden hoe je scherm staat en hoe je het wil. Pas als beide verschillen moet je de betreffende relais iets meer dan 500ms aansturen. Bijvoorbeeld variabele schermDicht 0= open (zon) 1= dicht. Dan in pseudo code
code sluiten
als regen en schermDicht = 0
sluiten uitgang aan
wacht x ms
uitgang uit
schermDicht = 1
code openen
als zon en schermDicht = 1
openen uitgang aan
wacht x ms
uitgang uit
schermDicht = 0
Zijn de standaard schakelaars momentschakelaars of hebben die ook een continu stand? Indien het laatste, hoe reageert de installatie als bijvoorbeeld de up toets vast aan is en je schakelt je relais om te dalen? Indien je relais aan blijft heb je hetzelfde probleem met je toetsen als met de toets die vast aan is.
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
if (setpoint != oldsetpoint){ //deze code wordt eenmaal uitgevoerd als het setpoint wijzigd
if (setpoint==1){
digitalWrite(switch_1, HIGH);// omhoog
digitalWrite(switch_2, LOW);
delay(500);
digitalWrite(switch_1, LOW);
}
else{
digitalWrite(switch_1, LOW);// omlaag
digitalWrite(switch_2, HIGH);
delay(500);
digitalWrite(switch_2, LOW);
}
}
else{ //het setpoint is niet gewijzigd
digitalWrite(switch_1, LOW);// stil
digitalWrite(switch_2, LOW);
}
Persoonlijk zou ik in if setpoint==1 high en low wisselen van plaats. Als switch 2 nog hoog is en je schakelt switch 1 hoog, heb je mogelijk miserie. Ik zou de tijd ook net iets langer nemen. Kwestie van zeker een halve seconde te hebben.
Waarom kijk je 2 keer na elkaar naar je regensensor?
rainValue = analogRead(rainPin); // read the value form the rain sensor
rainValue = analogRead(rainPin); // read the value from the rain sensor
Good practice is ook je code te laten inspringen. Zo zie je direct van waar tot waar een bepaalde scope loopt. Je zal dan ook sneller zien als er bijvoorbeeld een } te veel of te weinig is.
Op 1 augustus 2019 22:01:01 schreef KlaasZ:
Je kunt een bi-stabiel relais gebruiken. Dat hoef je alleen maar een korte puls te geven en dan blijft hij in de gekozen stand staan.
Er bestaan in de handel kant en klare systemen voor dit doel. Die kijken niet alleen naar regen, maar ook naar windsnelheid. Als het te hard waait gaat het scherm omhoog.
Bistabiel zou ik niet nemen. Moet je eigenlijk gaan controleren hoe je relais staat. Stel je relais staat in de aan stand en je elektriciteit valt weg. Je µC weet nu niet meer hoe je relais staat. Wat is een halve seconde een relais trekken?