ldr in combinatie ir

algemene C code
Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

ldr in combinatie ir

Berichtdoor Rob1970 » 13 Dec 2017, 23:10

ik heb de onderstaande stukje software gemaakt , werkt prima, maar heb een probleem
het is de bedoeling dat het licht aan gaat als de ldr donker ziet, maar wil hier op in kunnen grijpen. het moet ook mogelijk zijn om verlichting aan of uit te kunnen zetten ook al heeft de ldr ze al aan gezet .
dit aan en uit zetten wil ik via de ir afstanbediening doen .

wie kan mij op weg helpen.






#include <IRremote.h>

int RECV_PIN = 53; // the pin where you connect the output pin of TSOP4838
int itsONled[] = {0,0,0,0};
/* the initial state of LEDs is OFF (zero)
the first zero must remain zero but you can
change the others to 1's if you want a certain
led to light when the board is powered */
#define code1 0xFF30CF // knop 1
#define code2 0xFF18E7 // knop 2
#define code3 0xFF7A85 // knop3
#define code4 0xFF10EF // knop 4
#define code5 0xFF38C7 // knop 5
#define code6 0xFF5AA5 // knop 6

int led = 30; // the pin that the LED is atteched to
int sensor = 26; // the pin that the sensor is atteched to
int state = LOW; // by default, no motion detected
int val = 0; // variable to store the sensor status (value)



int output5 = 34; // verlichting links knop 1 geel 4
int output6 = 36; // verlichting achter knop2 groen 5
int output7 = 40; // verlichting boven tafel knop3 paars 6
int output8 = 42; // buiten verlichtin knop4

IRrecv irrecv(RECV_PIN);
decode_results results;

int LDRsensor = A0;
int Drempelwaarde = 800;
int analogValue = 0;


const int buttonPin = 22; // the number of the pushbutton pin
const int ledPin = 28; // the number of the LED

const int input2 = 24; // schakelaar schuur wit
const int output2 = 32; // verlichting schuurtje schakelaar oranje 1

const int input7 = 44; // schakelaar pportdeur
const int output1 = 38; // output voor poortdeur

// Variables will change:
// schakelaar schuur:
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin

// schakelaar schuurtje:
int ledState2 = HIGH; // the current state of the output pin
int buttonState2; // the current reading from the input pin
int lastButtonState2 = LOW; // the previous reading from the input pin

// poort deur :
int ledState3 = HIGH; // the current state of the output pin
int buttonState3; // the current reading from the input pin
int lastButtonState3 = LOW; // the previous reading from the input pin






// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.

// schuur :
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
// schuurtje:
unsigned long lastDebounceTime2 = 0; // the last time the output pin was toggled
unsigned long debounceDelay2 = 50; // the debounce time; increase if the output flickers

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
// poortdeur:
unsigned long lastDebounceTime3 = 0; // the last time the output pin was toggled
unsigned long debounceDelay3 = 50; // the debounce time; increase if the output flickers




void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(input2, INPUT);
pinMode(output2, OUTPUT);
pinMode(output1, OUTPUT);
pinMode(input7, INPUT);
pinMode(output5, OUTPUT);// verlichting lings :
pinMode(output6, OUTPUT);// verlichting achter:
pinMode(output7, OUTPUT);// verlichting deurslot
pinMode(output8, OUTPUT);// boven tafel

pinMode(led, OUTPUT); // initalize LED as an output
pinMode(sensor, INPUT); // initialize sensor as an input
Serial.begin(9600); // initialize serial

// set initial LED state
digitalWrite(ledPin, ledState);

irrecv.enableIRIn(); // Start the receiver

}

void loop() {




if (irrecv.decode(&results)){





unsigned int value = results.value;
switch(value) {
case code1:
if(itsONled[1] == 1) { // if first led is on then
digitalWrite(output5, LOW); // turn it off when button is pressed
itsONled[1] = 0; // and set its state as off
} else { // else if first led is off
digitalWrite(output5, HIGH); // turn it on when the button is pressed
itsONled[1] = 1; // and set its state as on
}
break;
case code2:
if(itsONled[2] == 1) {
digitalWrite(output6, LOW);
itsONled[2] = 0;
} else {
digitalWrite(output6, HIGH);
itsONled[2] = 1;
}
break;
case code3:
if(itsONled[3] == 1) {
digitalWrite(output7, LOW);
itsONled[3] = 0;
} else {
digitalWrite(output7, HIGH);
itsONled[3] = 1;
}
break;
}
Serial.println(value); // you can comment this line
irrecv.resume(); // Receive the next value
}





// read the state of the switch into a local variable:
int reading = digitalRead(buttonPin);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited long enough
// since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:

// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;

// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}

// set the LED:
digitalWrite(ledPin, ledState);

// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState = reading;


{
// read the state of the switch into a local variable:
int reading = digitalRead(input2);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited long enough
// since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState2) {
// reset the debouncing timer
lastDebounceTime2 = millis();
}

if ((millis() - lastDebounceTime2) > debounceDelay2) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:

// if the button state has changed:
if (reading != input2) {
buttonState2 = reading;

// only toggle the LED if the new button state is HIGH
if (buttonState2 == HIGH) {
ledState2 = !ledState2;
}
}
}

// set the LED:
digitalWrite(output2, ledState2);

// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState2 = reading;



{
// read the state of the switch into a local variable:
int reading = digitalRead(input7);

// check to see if you just pressed the button
// (i.e. the input went from LOW to HIGH), and you've waited long enough
// since the last press to ignore any noise:

// If the switch changed, due to noise or pressing:
if (reading != lastButtonState3) {
// reset the debouncing timer
lastDebounceTime3 = millis();
}

if ((millis() - lastDebounceTime3) > debounceDelay3) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:

// if the button state has changed:
if (reading != input7) {
buttonState3 = reading;

// only toggle the LED if the new button state is HIGH
if (buttonState3 == HIGH) {
ledState3 = !ledState3;
}
}
}

// set the LED:
digitalWrite(output1, ledState3);

// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState3 = reading;
}


{

val = digitalRead(sensor); // read sensor value
if (val == HIGH) { // check if the sensor is HIGH
digitalWrite(led, HIGH); // turn LED ON
delay(100); // delay 100 milliseconds

if (state == LOW) {
Serial.println("Motion detected!");
state = HIGH; // update variable state to HIGH
}
}
else {
digitalWrite(led, LOW); // turn LED OFF
delay(200); // delay 200 milliseconds

if (state == HIGH){
Serial.println("Motion stopped!");
state = LOW; // update variable state to LOW
}
}
}

{
// lees de LDR waarde uit en zet deze in een variable.
int LDRwaarde = analogRead(LDRsensor);
// print LDR waarde en LED status via seriele monitor
Serial.print("LDR waarde: ");
Serial.print(LDRwaarde);
Serial.print(" / LED status: ");



if (LDRwaarde < Drempelwaarde) {
// wat te doen als LDRwaarde < Drempelwaarde
digitalWrite(output8, LOW); //zet LED aan
Serial.print("AAN");
} else {
// wat te doen als LDRwaarde > Drempelwaarde
digitalWrite(output8, HIGH); //zet LED uit
Serial.print("UIT");
}

delay(100); // wacht 100 ms
Serial.println("");
}}}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ldr in combinatie ir

Berichtdoor Koepel » 14 Dec 2017, 01:32

Hallo, en welkom op dit forum.

Zo te zien ben je er al een tijd mee bezig.
Het meeste is in orde, maar ik mis een duidelijke structuur.

Kun je eens op Ctrl+T drukken, en de lege regels netjes bij werken ?

Je kunt de overbodige '{' en '}' verwijderen. Ik zie blokken code die zonder reden binnen de '{' en '}' staan. Dat mag overigens wel in de 'c'-taal.

In de loop() gebeurt er van alles, je kunt de verschillende delen van elkaar scheiden door stukken in een functie te zetten, en door er een duidelijk commentaar-blok boven te zetten.

Eventueel kun je de Bounce2 library gebruiken voor het debouncen. Dan wordt de sketch een stuk eenvoudiger. Of je eigen code in een functie zetten, dan wordt de sketch ook mooier en duidelijker.

Afhankelijk van de LDR zet je de digitale uitgang met digitalWrite(). Dat kan niet meer.
Je hebt gegevens (LDR, knoppen, sensoren, enzovoorts) en je hebt uitvoer (leds, relais, van alles).
Die twee zul je moeten scheiden, en dan kun je eenvoudig de logica er in programmeren.

Het is zelfs mogelijk om de loop() in drie stukken te splitsen. Waarbij alle data van LDR, knoppen en sensoren in variabelen wordt gezet en die worden later pas verwerkt.

Code: Alles selecteren
void loop()
{
  // --------------------------
  // Lees alle data van LDR, sensoren, knoppen
  // --------------------------

  // --------------------------
  // Process de data
  // --------------------------

  // --------------------------
  // Zet de uitgangen
  // --------------------------
}

Het tweede en derde deel zit vaak verweven in elkaar.

Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

Re: ldr in combinatie ir

Berichtdoor Rob1970 » 15 Dec 2017, 16:42

hallo thanks voor uitleg .

als ik het goed begrijp zal ik de value moeten gebruiken en hier mee de uitgang high moeten maken ?
het splitsen begrijp ik nog niet ?
ik ben het geheel wel even aan het bij werken

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ldr in combinatie ir

Berichtdoor Koepel » 15 Dec 2017, 20:40

Stel dat je alle gegevens hebt, je weet hoe donker het is en je weet welke knop zojuist op de afstandsbediening is ingedrukt. Dan kun je de beslissing maken om toch de verlichting aan of uit te zetten. Op dat moment wordt niet meer gekeken naar de waarde van de LDR, dus ik denk dat je een variabele nodig hebt om aan te geven dat de verlichting in 'override' mode is.
Je wilt zowel de verlichting aanzetten overriden, maar ook de verlichting uitzetten.

Nu komt het: een goede beschrijving.
Hier haken veel mensen af :(
Wanneer je een goede beschrijving kunt geven, dan heb je al de helft van het programma geschreven :)

Kun je alles beschrijven?
Stel de LDR ziet dat het donker is en de verlichting gaat aan. Met de afstandsbediening zet je die uit. En daarna weer aan. Is na de tweede keer een knop indrukken de bedoeling dat de LDR het weer overneemt? Zo ja, waarom na twee keer een knop indrukken ? En wat als je twee keer op dezelfde knop drukt ?
Stel dat je één keer op de afstandbediening drukt, wil je dan na een bepaalde tijd dat de LDR het automatisch overneemt ? Na hoeveel tijd ? Een uur ? Een dag ? of bij de overgang van licht naar donker of andersom ?

Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

Re: ldr in combinatie ir

Berichtdoor Rob1970 » 16 Dec 2017, 12:13

ok maar wat ik raar vindt dat mensen afhaken, dit is juist een forum waar we elkaar kunnen helpen dus haak ik niet af :?
ik heb gekeken op 'override' mode middels google en vond het volgende https://electronics.stackexchange.com/q ... ide-switch
het is inderdaad zo dat de ldr er voor zorgt dat licht aan gaat op ingestelde waarde ( int Drempelwaarde = 800;// waneer deze aan gaat ) het zal zo moeten zijn dat er ondanks het ingeschakelde licht er altijd lampen uitgedaan kunnen worden ,middels de afstandsbediening
als het op een gegeven moment door een druk op de knop weer druk (afstandsbediening) het geheel weer overgenomen kan worden door de ldr .
dus zoals je beschrijft zal het moeten werken, ben zoekende hou dit kleine ,maar niet onbelangrijk stukje werkend te krijgen

het is heel fijn en dankbaar dat er hulp is via dit forum Thanks

Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

Re: ldr in combinatie ir

Berichtdoor Rob1970 » 16 Dec 2017, 22:24

dus ben nu aan het zoeken geweest en vraag mij af welke variabele ik moet gebruiken voor de ldr dacht ik aan int analogValue = 0;
en bij de ir code aan de poort "code1 of code 2 " want dat is denk ik de input .

onderstaande code heb ik gevonden en wil hem nu gaan vullen

zoals je ziet heb ik input nodig , maar als ik naar de ir codes kijk denk ik dat het om code1,2,3 zal gaan
voor de "val"heb ik de variable van de ldr nodig dit kan" Drempelwaarde"maar ook "analogValue"
dit is waar ik mij afvraag of dat zo kan
onderste is niet wat ik heb ingevoerd maar moet nog worden gevoed z(zie de "schets" boven aan

kan iemand mij een duwtje in de goede richting helpen



int PIR_override = 3; // the number of the switch pin
int overridestatus = 12; // the number of the led pin

int relaypin = 13; // choose the pin for the LED
int inputPin = 2; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
int DELVAR = 3000; // Delay in milliseconds
int override_state = LOW; // the current state of the output pin

// set states for PIR override switch
int state = LOW; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = HIGH; // the previous reading from the input pin

///////////////////////////////////////////////////////
void setup() {
pinMode(relaypin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input

Serial.begin(9600);
}

void loop()
{
digitalRead(PIR_override); // read input value of PIR override switch
if (val == LOW)
{ // check if the input is LOW
val = digitalRead(inputPin); // read input value
if (val == HIGH)
{ // check if the input is HIGH
digitalWrite(relaypin, HIGH); // turn LED ON
if (pirState == LOW)
{
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
delay(DELVAR); // maximum delay is 32776 millisecons,
// delay(DELVAR); // so add multiple delays together to get
// delay(DELVAR); // so add multiple delays together to get
}
}
else
{
digitalWrite(relaypin, LOW); // turn LED OFF
if (pirState == HIGH)
{
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
else
{
digitalWrite(overridestatus, HIGH); // turn override status LED ON
digitalWrite(relaypin, HIGH); // turn relay ON
}
}
}
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ldr in combinatie ir

Berichtdoor Koepel » 17 Dec 2017, 00:04

Kun je voortaan de sketch tussen code-tags plaatsen?
Dat is met de knoppen boven het tekst-invoer-veld nadat je "Plaats een reactie" hebt gekozen. Met de knop "Code" of anders "Select a Syntax" en dan "C++".

De naam "override" heb ik zomaar gekozen. Je mag gerust iets anders gebruiken. De knoppen hebben "voorrang" boven de LDR.

Ik begrijp niet zo goed wat je met die tweede sketch wil.
Mijn bedoeling is om de verschillende onderdelen zoveel mogelijk uit elkaar te trekken, maar die tweede sketch zit dingen in elkaar te weven. Als ik die sketch probeer te lezen, dan raken mijn hersencellen net zo verstrikt in elkaar als dat de sketch verstrikt in elkaar zit.

Het uit elkaar trekken van de code is om de sketch wat duidelijker te maken. Een manier is om bijvoorbeeld eerst alle gegevens te verzamelen, zoals ik beschreef.

Heb je PIR sensoren ? Dan zou ook de StateChangeDetection er bij komen: https://www.arduino.cc/en/Tutorial/StateChangeDetection.

De werkelijkheid op een logische manier beschrijven is nog niet zo eenvoudig. Maar dat is wel waar je nu tegenaan loopt.
Zie je wat er gebeurt ? Jij komt met vage hints, en blijkbaar is het de bedoeling dat ik de beschrijving maak :?
Wil je dan drie knoppen gaan gebruiken? Een knop voor aanzetten, voor uitzetten en een knop voor automatisch via de LDR ?

Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

Re: ldr in combinatie ir

Berichtdoor Rob1970 » 21 Dec 2017, 21:31

tja zo wordt je dus wijzer over een forum, zal het doen ik zal mijn leven op dit punt verbeteren.

maar ok wat ik wil proberen , maar ben er nog niet uit hoe , ik denk dat het niet zo moeilijk is maar maar weet nog nie hoe .
de ir code (de afstandsbediening) zal de ldr moeten kunne overbruggen (kan dit makkelijk hardwarmatig doen , maar de software heeft de voorkeur)
als dus ldr hoog is moet ik middels de ir de boel weer uit of aan zetten.
nu zit hier een "value" in , kan ik deze gebruiken? of moet ik de value van de ldr sensor gebruiken ?
ik ben nog steeds opzoek hoe

gr rob

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: ldr in combinatie ir

Berichtdoor Koepel » 22 Dec 2017, 01:52

Het gaat nu niet om de sketch of een variabele. Het gaat er om dat jij aan ons kunt vertellen wat je wilt.

Het hardwarematig overbruggen van de LDR met een schakelaar kan natuurlijk ook in software. Maar dan krijg je iets dat anders is dan wat je tot nu toe verteld hebt.
Je wilde zowel de LDR overbruggen om het licht uit te houden alsook om het licht aan te houden. Dat zouden dan twee schakelaars bij de LDR worden. Met de afstandsbediening worden dat drie of vier knoppen.

Er zit voor mij niets anders op dan op te geven :cry:

Berichten: 9
Geregistreerd: 07 Dec 2017, 11:32

Re: ldr in combinatie ir

Berichtdoor Rob1970 » 07 Mrt 2018, 23:48

hier de oplossing


// lees de LDR waarde uit en zet deze in een variable.
int LDRwaarde = analogRead(LDRsensor);
// print LDR waarde en LED status via seriele monitor
// Serial.print("LDR waarde: ");
// Serial.print(LDRwaarde);
// Serial.print(" / LED status: ");

if (LDRwaarde < Drempelwaarde - 10 && ledIsOn == false) {
// wat te doen als LDRwaarde < Drempelwaarde
//digitalWrite(output8, LOW); //zet LED aan
itsONled[0] = itsONled[1] = itsONled[2] = itsONled[3] = true;
Serial.print("AAN");
ledIsOn = true;
}

if (LDRwaarde >= Drempelwaarde + 10 && ledIsOn == true) {
{
// wat te doen als LDRwaarde > Drempelwaarde
//digitalWrite(output8, HIGH); //zet LED uit
itsONled[0] = itsONled[1] = itsONled[2] = itsONled[3] = false;
Serial.print("UIT");
ledIsOn = false;
}

delay(100); // wacht 100 ms
Serial.println("");
}
}

digitalWrite(output5, ! itsONled[0]); // turn it off when button is pressed

// if( itsONled[0] ) {
// digitalWrite(output5, LOW); // turn it off when button is pressed
// }
// else {
// digitalWrite(output5, HIGH); // turn it off when button is pressed
// }
}
}

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten