ldr

algemene C code
Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

ldr

Berichtdoor robmulder » 26 Okt 2023, 20:32

beste allemaal ik ben al een tijdje klooien want onderstaande code heeft altijd goed gewerkt licht ging aan en mooi weer uit.
maar nu het probleem: het relais dat geschakeld moet worden gaat aan en dan naar 5 seconden weer uit en dit gaat dan de hele tijd door , hier door lijkt het wel disco buiten (de buiten verlichting wordt hier door geschakeld , ook een andere arduino geprobeert maar wordt niet anders .ik heb geen idee wat er aan de hand is ook de code voor de ldr geheel uit elkaar gehaald dat wil zeggen alleen de code voor de ldr
wat ook zo vreemd is dat het relais hoog blijft dus niet uitgaat als het licht is
als ik de serial monitor ga bekijken staat dat schemer al direkt op 1 staan wat dus raar is





#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

const int input1 = 33 ; // contact van de optocoupler ketel
const int output1 = 36; // pomp vloer verwarming

const int input2 = 35 ; // contact van deur meterkast
const int output2 = 38; // verlichtiing meterkast

const int output3 = 13; // pwm uitgang



byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ((val / 16 * 10) + (val % 16));
}
int sensorPin = A0; // select the input pin for ldr
int sensorValue = 0; // variable to store the value coming from the sensor
const int Light = 46;
int schemer = 0;
const unsigned long Vertraging = 5000; // tijdvertraging in milliseconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Light, OUTPUT);

pinMode(input1, INPUT_PULLUP); // relais contact cv pomp
pinMode(output1, OUTPUT); // pomp vloer verwarming

pinMode(input2, INPUT_PULLUP); // deur contact meterkast
pinMode(output2, OUTPUT); // verlichting meterkast

pinMode(output3, OUTPUT); // dimmer

}

void loop() {
// displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231

// readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

Serial.print("schemer=");
Serial.println(schemer);
Serial.print("timer1=");
Serial.println(timer1);

if (sensorValue < 40 && schemer == 0) { // Bij schemer zakt waarde onder de 700, zo niet timer1 nog uit.
if (timer1 != 0) { // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer1) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
schemer = 1; // het is schemer
timer1 = 0; // timer werk is klaar
}
} else {
timer1 = millis(); // timer aanzetten (timer1 wordt huidige tijd)
}
}

if (sensorValue > 60 && schemer == 1) { // Bij dageraad stijgt waarde boven de 750, zo niet timer2 nog uit.
if (timer2 != 0) { // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer2) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
schemer = 0; // schemer is voorbij
timer2 = 0; // en de timer is ook klaar
}
} else {
timer2 = millis(); // timer aanzetten (timer2 wordt huidige tijd)
}
}

if (schemer == 1) {
digitalWrite(Light, LOW);
}

else {
digitalWrite(Light, HIGH);
}
if (schemer == 1) {
analogWrite(output3,0);
}
else {
analogWrite(output3,75);
}
{
//read the pushbutton value into a variable
int sensorVal = digitalRead(input1);
//print out the value of the pushbutton
Serial.println(sensorVal);

// Keep in mind the pull-up means the pushbutton's logic is inverted. It goes
// HIGH when it's open, and LOW when it's pressed. Turn on pin 13 when the
// button's pressed, and off when it's not:
if (sensorVal == HIGH) {
digitalWrite(output1, HIGH);
} else {
digitalWrite(output1, LOW);
}
{
//read the pushbutton value into a variable
int sensorVal = digitalRead(input2);
//print out the value of the pushbutton
Serial.println(sensorVal);

// Keep in mind the pull-up means the pushbutton's logic is inverted. It goes
// HIGH when it's open, and LOW when it's pressed. Turn on pin 13 when the
// button's pressed, and off when it's not:
if (sensorVal == HIGH) {
digitalWrite(output2, HIGH);
} else {
digitalWrite(output2, LOW);
}
}

}}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: ldr

Berichtdoor shooter » 27 Okt 2023, 11:52

als eerste reactie doe een CTRL T in de editor dan komt het anders eruit zien, en dan zie je ook gelijk wat er bij elkaar hoort.
je begint met een delay 1000 dat is eigenlijk onnodig dus weg ermee, als je iets elke seconde wilt laten gebeuren dan kun je beter een millis() gebruiken.
ik zie dat je timer1 =0 maakt maar dat is niet zo slim want dan weet je niet waar deze opstond
geef beter namen dus bijv timer1 is schemertijd en output1 pompaan
je kunt ook define gebruiken als !define aan OFF dankrijg je bijv pompaan(aan) dat is leesbaarder
ook allerlei {} komen dan goed uit te zien
paul deelen
shooter@home.nl

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: ldr

Berichtdoor ThHe » 27 Okt 2023, 16:48

Volgende opmerkingen als ik de code bekijk:

ipv "int schemer = 0;" is het beter om hier een bool voor te gebruiken. (bool schemer = false;)
De opmerking dat schemer direct op 1 staat kan zijn dat het statement "if (schemer == 1)" ergens in je
orginele code staat als "if (schemer = 1)". (1 is(=) ipv 2 dan wordt schemer onbeduild de waarde 1)
Vandaar het advies om een bool te gebruiken.

if (sensorValue < 40 && schemer == 0) { // Bij schemer zakt waarde onder de 700, zo niet timer1 nog uit.
.......

Dit stukje software is niet helemaal waterdicht of het moet zo de bedoeling zijn.
Als de sensorValue even onder de 40 zakt en dan uren boven de 40 staat blijft de timer doorlopen.
Het gevolg is dat indien de value na uren weer onder de 40 zakt de timer is afgelopen en dus direct naar schemer = 1 gezet.
De vraag is dan waarom de timer?
Als dat niet de bedoeling is dan ontbreken de statements
if (sensorValue >= 40 && sensorValue <= 60) dan de timers op 0 zetten zodat ze alsnog gaan werken.

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: ldr

Berichtdoor robmulder » 28 Okt 2023, 20:37

als eerst erg bedank voor de antwoorden .
ik heb die foute delay er uit gedaan want dat slaat nergens op
ik ben aan de gang gegaan om het goed te laten werken het ziet er nu zo uit gaat dit zo goed ?.
de timer is er voor om hysterisch te krijgen omdat er dan het licht aan en uit gaat .









#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ((val / 16 * 10) + (val % 16));
}
int sensorPin = A0; // select the input pin for <span class="posthilit">ldr</span>
int sensorValue = 0; // variable to store the value coming from the sensor
const int Light = 13;
bool schemer = false;

const unsigned long Vertraging = 5000; // tijdvertraging in milliseconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Light, OUTPUT);

}

void loop() {



byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231

// readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

Serial.print("schemer=");
Serial.println(schemer);
Serial.print("timer1=");
Serial.println(timer1);

if (sensorValue < 700 && schemer == false) { // Bij schemer zakt waarde onder de 700, zo niet timer1 nog uit.
if (timer1 != 0) { // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer1) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
schemer = false; // het is schemer
timer1 = 0; // timer werk is klaar
}
} else {
timer1 = millis(); // timer aanzetten (timer1 wordt huidige tijd)
}
}

if (sensorValue > 750 && schemer == 1) { // Bij dageraad stijgt waarde boven de 750, zo niet timer2 nog uit.
if (timer2 != 0) { // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer2) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
schemer = false; // schemer is voorbij
timer2 = 0; // en de timer is ook klaar
}
} else {
timer2 = millis(); // timer aanzetten (timer2 wordt huidige tijd)
}
}

if (schemer == 1) {
digitalWrite(Light, HIGH);
}

else {
digitalWrite(Light, LOW);
}

}

Berichten: 27
Geregistreerd: 06 Sep 2017, 23:51

Re: ldr

Berichtdoor robmulder » 28 Okt 2023, 21:26

sorry dit moest zijn


#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ((val / 16 * 10) + (val % 16));
}
int sensorPin = A0; // select the input pin for <span class="posthilit">ldr</span>
int sensorValue = 0; // variable to store the value coming from the sensor
const int Light = 13;
bool schemer = false;

const unsigned long Vertraging = 5000; // tijdvertraging in milliseconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Light, OUTPUT);

}

void loop() {



byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231

// readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

Serial.print("schemer=");
Serial.println(schemer);
Serial.print("timer1=");
Serial.println(timer1);

if (sensorValue < 10 && schemer == false) { // Bij schemer zakt waarde onder de 10, zo niet timer1 nog uit.
if (timer1 != false) { // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer1) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
schemer = false; // het is schemer
timer1 = false; // timer werk is klaar
}
} else {
timer1 = millis(); // timer aanzetten (timer1 wordt huidige tijd)
}
}

if (sensorValue > 25 && schemer == true) { // Bij dageraad stijgt waarde boven de 25, zo niet timer2 nog uit.
if (timer2 != false) { // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer2) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
schemer = false; // schemer is voorbij
timer2 = false; // en de timer is ook klaar
}
} else {
timer2 = millis(); // timer aanzetten (timer2 wordt huidige tijd)
}
}

if (schemer == true) {
digitalWrite(Light, HIGH);
}

else {
digitalWrite(Light, LOW);
}

}

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: ldr

Berichtdoor ThHe » 29 Okt 2023, 00:04

Sorry het invoeren van een bool moet ook op andere plaatsen wat worden aangepast.
Ik ben zo vrij geweest je laatste code te muteren.
Als het niet blijft werken geef dan de resultaten uitt de serial.print ook door:
Succes verder: groet Theo

Code: Alles selecteren
#include <Time.h>
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte decToBcd(byte val) // Convert normal decimal numbers to binary coded decimal
{
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) // Convert binary coded decimal to normal decimal numbers
{
return ((val / 16 * 10) + (val % 16));
}
int sensorPin = A0; // select the input pin for <span class="posthilit">ldr</span>
int sensorValue = 0; // variable to store the value coming from the sensor
const int Light = 13;
bool schemer = false;

const unsigned long Vertraging = 5000; // tijdvertraging in milliseconden (testen)
unsigned long timer1 = 0;
unsigned long timer2 = 0;

void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(Light, OUTPUT);

}

void loop() {



byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231

// readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen

Serial.print("schemer=");
Serial.println(schemer);
Serial.print("timer1=");
Serial.println(timer1);

// **** Test geen schemer is de syntax "!schemer" (oftewel not schemer)
if (sensorValue < 10 && !schemer) { // Bij schemer zakt waarde onder de 10, zo niet timer1 nog uit.
if (timer1 != 0) { // Kijkt of timer1 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer1) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "1"
schemer = true; // het is schemer
timer1 = 0; // timer werk is klaar
}
} else {
timer1 = millis(); // timer aanzetten (timer1 wordt huidige tijd)
}
}
// **** Test schemer is de syntax "schemer"
if (sensorValue > 25 && schemer ) { // Bij dageraad stijgt waarde boven de 25, zo niet timer2 nog uit.
if (timer2 != 0) { // Kijkt of timer2 waarde > 0 heeft, zo niet timer "aan"
if ((millis() - timer2) > Vertraging) { // Zo ja, timer loopt en na 120 seconden (test = 5) wordt schemer "0"
schemer = false; // schemer is voorbij
timer2 = 0; // en de timer is ook klaar
}
} else {
timer2 = millis(); // timer aanzetten (timer2 wordt huidige tijd)
}
}

if (schemer == true) {
digitalWrite(Light, HIGH);
}

else {
digitalWrite(Light, LOW);
}

}

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: ldr

Berichtdoor ThHe » 29 Okt 2023, 16:03

Nog even een extra aanvulling

if (sensorValue > 25 && schemer ) { // Bij dageraad stijgt waarde boven de 25, zo niet timer2 nog uit.
.....
}

Het stukje code voor het omzetten van schemer is niet waterdicht en vooral gevoelig voor instabiel lezen van de sensor.
Reden is dat in de stukjes code 2 aspecten door elkaar worden gehaald.
1: gebruik van de timer.
2: bepaling schemer situatie.

Hier een stukje code waarbij iets anders met de timer / schemer wordt omgegaan.
Doe er je voordeel mee.

Code: Alles selecteren
// vast ingestelde waarden
#define SCHEMER_ON  10
#define SCHEMER_OFF 25
#define VERTRAGING  5000

unsigned long timer = 0;
int sensorValue = 0;       // variable to store the value coming from the sensor
bool schemer = true;       // sensorValue = 0  is schemer = true voor de juiste start.

void setup() {
   ...
}

void loop() {
   sensorValue = analogRead(sensorPin); // read the value from the sensor

    // Indien de sensorValue < SCHEMER_ON of sensorValue > SCHEMER_OFF) dan moet de timer starten of gaan lopen.
    if ((sensorValue < SCHEMER_ON || sensorValue > SCHEMER_OFF)){
        if (timer == 0){   // Timer aanzetten.
            timer = millis();
        }
    }
    else{ // Geen timer tussen SCHEMER_ON en SCHEMER_OFF
        timer = 0;
    }
   // Indien de timer loop maar de tijd is ook verstreken dan schemer zetten en de timer uitzettten.
    if (timer != 0 && (millis() - timer) > VERTRAGING)
    {
        timer = 0;
        schemer =  sensorValue < 10;   
    }

    if (timer) ........
}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: ldr

Berichtdoor shooter » 31 Okt 2023, 19:22

meer haakjes nodig in if verhaal want het moet wel bool zijn, dus if ((laag <midden) &&(hoog > midden))
paul deelen
shooter@home.nl

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: ldr

Berichtdoor ThHe » 01 Nov 2023, 00:25

Het statement:

Code: Alles selecteren
if ((sensorValue < SCHEMER_ON || sensorValue > SCHEMER_OFF)){


bevat teveel haakjes het moet namelijk zijn:

Code: Alles selecteren
if (sensorValue < SCHEMER_ON || sensorValue > SCHEMER_OFF){


Het plaatsen van overbodige haakjes is natuurlijk toegestaan maar heeft geen enkele toevoeging op de werking van het programma.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: ldr

Berichtdoor shooter » 01 Nov 2023, 10:19

kijk even naar de plaats van die haakjes want sensorValue< schemer_on daar hoort een haakje omheen want dat is om er een boolean van te maken. want dat kan de compiler niet raden. en sorry liever teveel haakjes want dan is het duidelijk net zoals op de rekenles vroeger.
paul deelen
shooter@home.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 36 gasten