Arduino stopt bij IR module

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Arduino stopt bij IR module

Berichtdoor Papui » 03 Mei 2017, 16:27

Allen,

pas nieuw hier op het forum en ook nog vrij nieuw met Arduino. In mijn avondschool heb ik hier mee leren werken een paar weken geleden en nu moet ik een project inleveren. Het is ook bij dit project dat er iets mis is.

In mijn code heb ik gebruikt gemaakt van de IR module die standaard bij het Elegoo Mega pakket geleverd zit maar als ik de afstandsbediening gebruik blijft alles staan totdat de uitgang weer laag is.

De bedoeling is om met de afstandsbediening ventilatiemotors aan te zetten zonder een verhoogde luchtvochtigheid. Maar als ik dit activeer krijg ik mijn licht niet meer aan en stopt de communicatie met de Seriële monitor en met de LCD display voor de ingestelde tijd. Kunnen jullie me aanwijzingen geven waar het mis loopt in mijn code aub?

Waarschijnlijk zitten er nog grote fouten in het programma maar zoals al aangehaald ben ik een nieuweling op het gebied van Arduino en programmeren. Alle tips en opmerkingen zijn uiteraard van harte welkom.

Hierbij de code:

#include "DHT.h" // library voor de DHT-11
#define DHTPIN 7 // aan welke digitale pin de DHT-11 aangesloten is
#define DHTTYPE DHT11 // DHT 11
#include "LiquidCrystal.h" // library voor de LCD
LiquidCrystal lcd(12,11,5,4,3,2); // aansluitingen van de LCD op de digitale pinnen
#include "IRremote.h" // library voor de IR module
#include "DS3231.h" // library voor de RTC module

DHT dht(DHTPIN, DHTTYPE);
int Ventilatiemotor1=8;
int Ventilatiemotor2=9;
int Relaycontact=6;
int sensorPin=A0; // select the input pin voor de ldr
int sensorValue=0; // variable to store the value coming from the ldr
int inputPin=18; // de PIR sensor is aangelosloten op digitale pin 18
int pirState=LOW; // we start, assuming no motion detected
int sensorValuePIR=0; // variable for reading the pin status
int receiver=19; // de IR module is aangesloten op digitale pin 19
IRrecv irrecv(receiver);
decode_results results;
DS3231 rtc(SDA,SCL); // de gebruikte hardware van de DS3231 toevoegen

void setup() {
pinMode(Ventilatiemotor1, OUTPUT);
pinMode(Ventilatiemotor2,OUTPUT);
pinMode(Relaycontact, OUTPUT); // definieer Relaycontact als OUTPUT
pinMode(inputPin, INPUT); // definieer inputPin als INPUT (PIR-sensor)
Serial.begin(115200); // initialize the serial communications

dht.begin(); // start van de DHT-11
lcd.begin(16,2); // weergeven hoeveel rijen kolommen de LCD heeft

irrecv.enableIRIn(); // start de receiver

rtc.begin(); // initialiseer de rtc in het object
//rtc.setDOW(WEDNESDAY);
//rtc.setTime(15, 51, 30);
//rtc.setDate(3, 4, 2017);
}

void loop() {
delay(500);

lcd.setCursor(0, 1);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);

if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
lcd.print("ERROR");
return;}

lcd.print(" Temp: "); // LCD print van de DHT11
lcd.print(t); // LCD print van de DHT11
lcd.print(" Humidity: "); // LCD print van de DHT11
lcd.print(h); // LCD print van de DHT11
lcd.scrollDisplayLeft(); // LCD print van de DHT11

lcd.setCursor(0,0);
lcd.print(rtc.getDOWStr()); // LCD print van de RTC module
lcd.print("--"); // LCD print van de RTC module
lcd.print(rtc.getTimeStr()); // LCD print van de RTC module

float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: "); // DHT11
Serial.print(h); // DHT11
Serial.print(" %\t"); // DHT11
Serial.print("Temperature: "); // DHT11
Serial.print(t); // DHT11
Serial.print(" *C "); // DHT11

Serial.print(" LDR-value: "); // LDR
Serial.println(sensorValue); // LDR

Serial.print(rtc.getDOWStr()); // RTC module
Serial.print(" "); // RTC module

Serial.print(rtc.getDateStr()); // RTC module
Serial.print(" -- "); // RTC module

Serial.println(rtc.getTimeStr()); // RTC module

if ((h>=50) && (h<=100))
digitalWrite(Ventilatiemotor1,HIGH);
else digitalWrite(Ventilatiemotor1,LOW);
if ((h>=65) && (h<=100))
digitalWrite(Ventilatiemotor2,HIGH);
else digitalWrite(Ventilatiemotor2,LOW);

sensorValue = analogRead(sensorPin); // read the value from the sensor ldr
sensorValuePIR = digitalRead(inputPin);
if((sensorValue > 920) && (sensorValuePIR==HIGH)) //setting a threshold value
digitalWrite(Relaycontact,HIGH); //turn relay ON
else digitalWrite(Relaycontact,LOW); //turn relay OFF


if(irrecv.decode(&results)){
if(results.value==0x9716BE3F) // code van de afstandsbediening
{ digitalWrite(Ventilatiemotor1,HIGH);
delay(50000);} // definieren hoelang de uitgang actief blijft
irrecv.resume(); // receive the next value

if(results.value==0x3D9AE3F7) // code van de afstandsbediening
{ digitalWrite(Ventilatiemotor2,HIGH);
delay(50000);} // definieren hoelang de uitgang actief blijft
irrecv.resume(); // receive the next value

if(results.value==0x6182021B) // code van de afstandsbediening
{ digitalWrite(Ventilatiemotor1,HIGH);
digitalWrite(Ventilatiemotor2,HIGH);
delay(50000);} // definieren hoelang de uitgang actief blijft
irrecv.resume();} // receive the next value

delay(1000);}

Advertisement

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

Re: Arduino stopt bij IR module

Berichtdoor Koepel » 03 Mei 2017, 18:35

Hallo.

Kosten regels veel geld ? ;) Je probeert erg veel op één regel te proppen, maar er is niemand die dat doet. Je kunt beginnen met op Ctrl+T te drukken, en schrijf de code gerust wat ruimer op.

Kijk in je sketch naar het gebruik van delay() functie. Wanneer je iets van de afstandsbediening ontvangt, dan wacht je 50 seconden. Dus je zit ergens op te wachten, maar ik weet niet waarop.

Ik weet niet welke DHT library je hebt, maar volgens mij zet de DHT library even de interrupts uit. Op dat moment wordt de IR code niet goed ontvangen. Dus alle delays verwijderen kan problemen geven. Ik weet ook niet of die DHT library zelf het opvragen van de sensor beperkt tot langzamer dan één keer per twee seconden, of dat je dat zelf moet beperken.

Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Re: Arduino stopt bij IR module

Berichtdoor Papui » 03 Mei 2017, 19:20

Beste,

al dank voor de reactie. Ik dacht het op die manier iets overzichtelijker te maken maar dat is dus mislukt blijkbaar. :D
Wat bedoel je juist met de ctrl+T? Wat doet dit?

Hetgeen ik kan vinden over de DHT library is: SimpleDHT met voorbeeldcode:DHT11Default. Ben je hier iets mee?

Die 50 seconden wachten bij het ontvangen van het signaal van de afstandsbediening is de tijd dat de uitgang hoog moet blijven. In het eerste geval moet uitgang "Ventilatiemotor1" 50 seconden hoog blijven. Na die 50 seconden valt dan de "ventilatiemotor" uit. Anders is de uitgang alleen maar hoog als de knop van de afstandsbediening ingeduwd wordt.

Zou een andere DHT library hulp kunnen bieden?

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Arduino stopt bij IR module

Berichtdoor baco1978 » 03 Mei 2017, 23:34

wat koepel bedoeld is
de volgende regel :

delay(50000);

met deze delay funktie, wacht je arduino 50 secondes, in deze tijd doet de arduino niks..
aangezien je dat niet wilt, moet je eens kijken naar het voorbeeld blink without delay
Met vriendelijke groet Arjan

Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Re: Arduino stopt bij IR module

Berichtdoor Papui » 04 Mei 2017, 17:36

Dank jullie wel voor de hulp. Ik had dat dus helemaal verkeerd begrepen. De code "blink without delay" eens geprobeerd samen met talloze andere mogelijkheden/codes maar ik geraak er niet uit. Het lukt me niet.

Binnen een uur moet mijn project binnen dus dat gaat niet meer lukken vrees ik, alhoewel ik tot de laatste moment probeer. In de bijgevoegde code zijn enkele wijzigingen aangebracht op het laatste commando van de IR-module maar het lukt me maar niet.

De 2 uitgangen gaan wel branden maar echt maar voor een seconde ofzo, terwijl dit toch een seconde of 5 zou moeten zijn. Kan iemand me nog helpen, al is het maar dat ik alsnog weet wat ik in het vervolg moet doen om de millis aan het werk te krijgen. Want ik zoek zeker verder te werken met de arduino.

Code:

#include "DHT.h" // library voor de DHT-11
#define DHTPIN 7 // aan welke digitale pin de DHT-11 aangesloten is
#define DHTTYPE DHT11 // DHT 11
#include "LiquidCrystal.h" // library voor de LCD
LiquidCrystal lcd(12,11,5,4,3,2); // aansluitingen van de LCD op de digitale pinnen
#include "IRremote.h" // library voor de IR module
#include "DS3231.h" // library voor de RTC module

DHT dht(DHTPIN, DHTTYPE);
int Ventilatiemotor1=8;
int Ventilatiemotor2=9;
unsigned long currentTime;
unsigned long loopTime;
int Relaycontact=6;
int sensorPin=A0; // select the input pin voor de ldr
int sensorValue=0; // variable to store the value coming from the ldr
int inputPin=18; // de PIR sensor is aangelosloten op digitale pin 18
int pirState=LOW; // we start, assuming no motion detected
int sensorValuePIR=0; // variable for reading the pin status
int receiver=19; // de IR module is aangesloten op digitale pin 19
IRrecv irrecv(receiver);
decode_results results;
DS3231 rtc(SDA,SCL); // de gebruikte hardware van de DS3231 toevoegen

void setup() {
pinMode(Ventilatiemotor1, OUTPUT);
pinMode(Ventilatiemotor2,OUTPUT);
pinMode(Relaycontact, OUTPUT); // definieer Relaycontact als OUTPUT
pinMode(inputPin, INPUT); // definieer inputPin als INPUT (PIR-sensor)
Serial.begin(115200); // initialize the serial communications

dht.begin(); // start van de DHT-11
lcd.begin(16,2); // weergeven hoeveel rijen kolommen de LCD heeft

irrecv.enableIRIn(); // start de receiver

rtc.begin(); // initialiseer de rtc in het object
//rtc.setDOW(THURSDAY);
//rtc.setTime(17, 19, 10);
//rtc.setDate(4, 5, 2017);

currentTime=millis();
loopTime=currentTime;

}

void loop() {
delay(500);

lcd.setCursor(0, 1);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);

if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
lcd.print("ERROR");
return;}

lcd.print(" Temp: "); // LCD print van de DHT11
lcd.print(t); // LCD print van de DHT11
lcd.print(" Humidity: "); // LCD print van de DHT11
lcd.print(h); // LCD print van de DHT11
lcd.scrollDisplayLeft(); // LCD print van de DHT11

lcd.setCursor(0,0);
lcd.print(rtc.getDOWStr()); // LCD print van de RTC module
lcd.print("--"); // LCD print van de RTC module
lcd.print(rtc.getTimeStr()); // LCD print van de RTC module

float hif = dht.computeHeatIndex(f, h);
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: "); // DHT11
Serial.print(h); // DHT11
Serial.print(" %\t"); // DHT11
Serial.print("Temperature: "); // DHT11
Serial.print(t); // DHT11
Serial.print(" *C "); // DHT11

Serial.print(" LDR-value: "); // LDR
Serial.println(sensorValue); // LDR

Serial.print(rtc.getDOWStr()); // RTC module
Serial.print(" "); // RTC module

Serial.print(rtc.getDateStr()); // RTC module
Serial.print(" -- "); // RTC module

Serial.println(rtc.getTimeStr()); // RTC module

if ((h>=50) && (h<=100))
digitalWrite(Ventilatiemotor1,HIGH);
else digitalWrite(Ventilatiemotor1,LOW);
if ((h>=65) && (h<=100))
digitalWrite(Ventilatiemotor2,HIGH);
else digitalWrite(Ventilatiemotor2,LOW);

sensorValue = analogRead(sensorPin); // read the value from the sensor ldr
sensorValuePIR = digitalRead(inputPin);
if((sensorValue > 920) && (sensorValuePIR==HIGH)) //setting a threshold value
digitalWrite(Relaycontact,HIGH); //turn relay ON
else digitalWrite(Relaycontact,LOW); //turn relay OFF


if(irrecv.decode(&results))
{
if(results.value==0x9716BE3F) // code van de afstandsbediening
{
digitalWrite(Ventilatiemotor1,HIGH);
delay(5000); // definieren hoelang de uitgang actief blijft
{
irrecv.resume(); // receive the next value

if(results.value==0x3D9AE3F7) // code van de afstandsbediening
{
digitalWrite(Ventilatiemotor2,HIGH);
delay(5000); // definieren hoelang de uitgang actief blijft
}
irrecv.resume(); // receive the next value

if(results.value==0x6182021B) // code van de afstandsbediening
{
if (currentTime>=(loopTime+5000));
{
digitalWrite(Ventilatiemotor1,HIGH);
digitalWrite(Ventilatiemotor2,HIGH); // definieren hoelang de uitgang actief blijft
loopTime=currentTime;
}
irrecv.resume(); // receive the next value
}

}

delay(1000);}

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

Re: Arduino stopt bij IR module

Berichtdoor Koepel » 04 Mei 2017, 18:05

Het gebruik van millis() vereist een aparte aanpak. In het begin is dat kopiëren van anderen.
Op Arduino boards met snellere processors kun je (beperkt) multitasking doen, en gelukkig vervalt dan het gebruik van millis() om meerdere dingen tegelijk te doen. Ik hoop dat over 5 jaar alles multitasking is.

millis() kan gebruikt worden als software timer, zoals de BlinkWithoutDelay.
millis() kan gebruikt worden als tijdvertraging. Ik gebruik daarvoor twee variabelen: een 'previousMillis' en een 'enableDelay'. In de loop() kijk ik dan naar de 'previousMillis' om te testen of die tijdvertraging al voorbij is.

Het moment dat de tijdvertraging gestart wordt, is het nodig om de tijd van dat moment te onthouden. Ik noem dat een 'timestamp'. De 'enableDelay' geeft aan of de tijdvertraging bezig is of niet.

Vervolgens kan gekeken worden of de tijdvertraging al afgelopen is, en dan wordt het uitgezet door 'enableDelay' false te maken.

Ongeveer zo:
Code: Alles selecteren
unsigned long previousMillis;
boolean enableDelay = false;

void setup()....

Void loop()
{
  if(...
  {
    digitalWrite( 13, HIGH);
    previousMillis = millis();    // timestamp this moment.
    enableDelay = true;  // enable this software timer.
  }

  ...

  if( enableDelay)   // delay active ?
  {
    if( millis() - previousMillis >= 50000UL)   // 'UL' means Unsigned Long
    {
      digitalWrite( 13, LOW);
      enableDelay = false;   // disable this software timer
    }
  }
}

Het bovenstaande vind ik handig, omdat het afhandelen van (meerdere) tijdvertragingen los staat van de rest van de code. Zolang er maar ergens in de loop() naar die tijdvertragingen wordt gekeken, dan is het goed.
Ik zie vaak dat anderen de 'enableDelay' niet hebben, maar dat ergens verwerken in het if-statement. Dan zit de code echter teveel in elkaar gedraait, en dan moet ik gaan nadenken. Dat is maar vermoeiend ;)

Berichten: 15
Geregistreerd: 03 Mei 2017, 15:58

Re: Arduino stopt bij IR module

Berichtdoor Papui » 07 Mei 2017, 12:41

Project is binnengedaan en blijkbaar was het ontbreken van de millis zelfs geen enkel probleem. Hij verwachtte niet eens dat we die gingen gebruiken. Al heel blij natuurlijk maar desondanks had ik het in mijn project toch graag aan de praat gekregen.

In mijn renovatie ben ik toch aan het nadenken om met kwalitatieve sensoren dit programma in gebruik te nemen. Het ethernet shield W5100 is ook al besteld maar dus eerst het gebruik van de millis.

#koepel: indien ik de code die u hier heeft gepost inplementeer zou het moeten werken dan? Ik zal in de loop van de week eens proberen om het toe te passen. En ik laat het resultaat hierop nog zeker weten.

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

Re: Arduino stopt bij IR module

Berichtdoor Koepel » 07 Mei 2017, 14:32

:o je zei "u". Zeg maar gerust "je" hoor. We zijn hier als Arduino enthousiastelingen onder elkaar :D

Of het dan werkt, dat weet ik niet. Ik heb nog niet zo goed naar de rest van de code gekeken. Maar ik zag dat je 50 seconden zat te wachten met "delay()". Dat is nu 5 seconden geworden.

Wanneer je webpagina hebt draaien op een Ethernet Shield, dan is het gebruik van millis() hard nodig. Je wilt natuurlijk wel die webpagina zien, zonder eerst heel lang te moeten wachten.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten