Nu heb ik 2 fouten in mijn code zitten, waar ik de fout er niet van in zie. Kun iemand mij misschien uit de brand helpen? Heb het één en ander al geprobeerd. Maar ik blijf op die 2 punten vast zitten.... Hier is het gedeelte van de code waar het om gaat.
void loop() {
unsigned long currentMillis = millis(); //
unsigned long currentMillis2 = millis(); //
//Zorgt ervoor dat de loops "checkMenuKnop, meetEnRegel en menuWeergave continue uitgelezen blijven worden
checkMenuKnop();
if (currentMillis - previousMillis >= 100) { //
// save the last time you updated the menu
previousMillis = currentMillis; //
meetEnRegel(); //
menuWeergave(buttonPushCounter); //
}
}
}
Serial.println();
Serial.print("LDR read: ");
Serial.print(analogRead(0));
unsigned long currentMillis = millis();
}
//PIR Sensor
unsigned long currentMillis2 = millis(); //Dit stukje leest de PIR sensor uit, en zet wanneer nodig het licht aan
if (lichtPushCounter == 1) { //Laat dit stukje alleen afspelen als het licht op automatisch staat
if (digitalRead(PIR) == HIGH) {
Serial.println();
Serial.println("Beweging gedetecteerd");
Serial.println("-------------------------");
Serial.println("Het Lamp Gaat/staat aan");
digitalWrite(Lamp, HIGH); //Zet het licht aan wanneer er beweging is gedetecteerd
previousMillisPirLedUit = currentMillis;
}
else {
Serial.println();
Serial.println("Geen beweging gedetecteerd: het Lamp staat uit of gaat over enkele minuten Uit"); //Zet het licht na een bepaalde tijd uit
if (currentMillis2 - previousMillisPirLedUit >= lichtTijd) {
digitalWrite(Lamp, LOW); //Zet het licht uit wanneer er een bepaalde tijd geen beweging is gedetecteerd
}
}
}
Je hebt een gedeelte van je code geplaatst, het gedeelte waar jij denkt dat het probleem zit.
Maar of dat echt zo is weten we niet, want de compiler klaagt over de functie "checkMenuKnop();", en die zit er niet bij.
De klacht van de compiler is dat je een variabele wil gebruiken die 'm niet bekend is, en dat is dus niet een variabele, maar de functie checkMenuKnop.
Dus die functie is er niet, of word niet als zodanig herkend, of wie weet wat er nog meer mis kan zijn.
Ik denk dat ik het inmiddels wel weet door met jouw snippet te spelen, maar ik kan er niet zeker over zijn.
Daarom moet je je hele code plaatsen als je een passend en juist antwoord wil krijgen.
Dit is zeer waarschijnlijk geen groot probleem, maar er zo eentje waar je zelf steeds overheen kijkt en je even een paar ogen van iemand anders voor moet lenen.
Of naar kijken als je er een nachtje over geslapen hebt.
Er is iets vreemds aan de hand met je accolades, waarschijnlijk ligt het daaraan.
Je lijkt currentMillis2 (die trouwens compleet overbodig is) tweemaal te definiëren. Edit: en currentMillis ook.
Gelieve je volledig code te posten. (Druk eerst op CTRL+T in de IDE om automatische opmaak toe te passen zodat het beter leesbaar is.)
#include <DHT.h>
#include <DHT_U.h>
/*
The circuit:
* 5V to Arduino 5V pin
* GND to Arduino GND pin
* SCL to Analog #5
* SDA to Analog #4
*/
// include the library code:
#include <Wire.h>
#include "LiquidCrystal.h"
#include "DHT.h"
//Aangeven van
#define DHTTYPE DHT11
#define DHTPIN 7
int t;
int h;
DHT dht(DHTPIN, DHTTYPE);
// Connect via i2c, default address #0 (A0-A2 not jumpered)
LiquidCrystal lcd(0);
// Constanten
int BUTTON_N = 2; //Knop om naar de volgende pagina te gaan
int down = 3; //Knop om de temperatuur lager te zetten
int up = 4; //Knop om de temperatuur te verhogen/Lamp knop
//DHT = 7; //Temperatuur/vochtigheids sensor
int pin = 8; //Stof/pollen sensor
int buzzPin = 9; //Alarm
int PIR = 10; //PIR
int VerwarmingLed = 11; //Led voor als de verwarming aan gaat
int VentilatorLed = 12; //Led voor als de ventilator aan gaat
int Lamp = 5; //Led voor verlichting
// Variabelen
int buttonPushCounter = 0; // counter for the number of button presses
int lichtPushCounter = 1; // Teller voor het aantal drukken op de knop
int buttonState = 0; // current state of the button
int lbuttonState = 0; //
int lastButtonState = 0; // previous state of the button
int lButtonState = 0;
int VraagTemp = 22; // Ideale temperatuur
int state = HIGH; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = LOW; // the previous reading from the input pin
int LVH = 35; // ideale luchtvochtigheid
int lichtTijd = 20000; // Tijd na hoelang het licht uit moet gaan
//Tellen in setup
int count = 0; // tellen vanaf 0
// Alle Millis
unsigned long previousMillis = 0;
long time = 0;
long debounce = 200;
unsigned long previousMillisPirLedUit = 0;
unsigned long currentMillis;
void setup() {
// Sensoren en knoppen als input intializeren: //
pinMode(BUTTON_N, INPUT); //
pinMode(up, INPUT); //
pinMode(down, INPUT); //
pinMode(PIR, INPUT); //
// Leds als output intializeren: //
pinMode(VentilatorLed, OUTPUT); //
pinMode(VerwarmingLed, OUTPUT); //
pinMode(Lamp, OUTPUT);
//Zet de LCD aan en zet hoe groot deze is
lcd.begin(16, 2); // 16 digits en 2 regels
//Begin seriele communicatie //
Serial.begin(9600); //
//Laat het opstart scherm 5 seconden zien, geeft ook de sensoren heel even de tijd om op te starten
lcd.setCursor(1, 0); //
lcd.print("Sander"); // Laat onze groepsnaam zien
lcd.setCursor(2, 1); //
lcd.print("Leliveld"); //
delay(5000); //
lcd.clear(); //
buttonPushCounter = 1; //Zet het aantal keer geklikt op 1 zodat je bij het begin van het menu begint
if(count == 10){
Serial.println("Start");
while(1); // Hang the program. Countdown over.
}
Serial.println(count++); // print het tellen en telt er 1 bij
delay(1000);
Serial.begin(9600);
dht.begin();
}
void loop() {
unsigned long currentMillis = millis(); //
unsigned long currentMillis2 = millis(); //
//Zorgt ervoor dat de loops "checkMenuKnop, meetEnRegel en menuWeergave continue uitgelezen blijven worden
checkMenuKnop();
if (currentMillis - previousMillis >= 100) { //
// save the last time you updated the menu
previousMillis = currentMillis; //
meetEnRegel(); //
menuWeergave(buttonPushCounter); //
}
}
void menuWeergave(int menu) { //
lcd.setCursor(0, 0); //Zorgt ervoor dat het eerste karakter in het allereerste vakje van de LCD komt
if (menu == 1) { // Begint met het menu kopje "Temperatuur"
Serial.println (""); //
Serial.println ("Temperatuur"); //
//hier komt lcd temp //
float t = dht.readTemperature(); // Zorgt ervoor dat de temperatuur ook in deze loop uitgelezen kan worden
lcd.setCursor(0, 0); //
lcd.print("Temp: "); // Laat de huidige temperatuur zien
lcd.print(t); //
lcd.print((char)223); //
lcd.print("C"); //
lcd.setCursor(0, 1); //
lcd.print("Vraag Temp: "); // Laat de gevraagde temperatuur zien
lcd.print(VraagTemp); //
lcd.print((char)223); //
lcd.print("C"); //
if (digitalRead(up) == HIGH) { // Laat je de temperatuur omhoog instellen
VraagTemp++; //
Serial.print("NIEUWE TEMPERATUUR: ="); //
Serial.println(VraagTemp); //
} //
else { //
} //
if (digitalRead(down) == HIGH) { // Laat je de temperatuur omlaag instellen
VraagTemp--; //
Serial.print("NIEUWE TEMPERATUUR: ="); //
Serial.println(VraagTemp); //
} //
} //
if (menu == 2) { // Kopje die laat zien hoe veel vocht er in de lucht zit
float h = dht.readHumidity(); //
Serial.println ("Humidity"); //
lcd.setCursor(0, 0); //
lcd.print("Vochtigheid: "); // Laat de huidige luchtvochtigheid zien
lcd.print(h); //
lcd.print("%"); //
lcd.setCursor(0, 1); //
lcd.print("gew. luchtv. "); // Laat de gewenste luchtvochtigheid zien
lcd.print(LVH); //
lcd.print("%"); //
if (digitalRead(up) == HIGH) { // Laat je de luchtvochtigheid omhoog instellen
LVH++; //
Serial.print("NIEUWE LUCHTVOCHTIGHEID: ="); //
Serial.println(LVH); //
} //
else { //
} //
if (digitalRead(down) == HIGH) { // Laat je de luchtvochtigheid omlaag instellen
LVH--; //
Serial.print("NIEUWE LUCHTVOCHTIGHEID: ="); //
Serial.println(LVH); //
} //
}
if (menu == 3) { // Kopje waar je het licht handmatig aan/uit/automatisch kunt zetten
Serial.println ("Verlichting");
lbuttonState = digitalRead(up);
if (lbuttonState != lButtonState) {
// if the state has changed, increment the counter
if (lbuttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
lichtPushCounter++;
if (lichtPushCounter == 4) lichtPushCounter = 1; // zorgt ervoor dat het menutje 1 loop blijft
Serial.print("number of licht button pushes: ");
Serial.println(lichtPushCounter);
}
if (lichtPushCounter == 1) { // Laat het licht systeem op de PIR sensor code draaien
lcd.setCursor(0, 1);
lcd.print("Automatisch");
}
if (lichtPushCounter == 2) { // Zet het licht aan tot verdere instucties
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Aan");
digitalWrite(Lamp, HIGH);
}
if (lichtPushCounter == 3) { // Zet het licht uit tot verdere instucties
lcd.setCursor(0, 1);
lcd.print("Uit");
digitalWrite(Lamp, LOW);
}
}
lcd.setCursor(0, 0);
lcd.print("Verlichting");
lcd.setCursor(0, 0); //
} //
if (menu == 4) { // Laat zien of er beweging is gedetecteerd in de kamer
Serial.println ("Beweging"); //
if (digitalRead(PIR) == HIGH) {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Beweging");
lcd.setCursor(0, 1);
lcd.print("gedetecteerd");
}
else {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Geen beweging");
lcd.setCursor(0, 1);
lcd.print("gedetecteerd");
}
//
} //
if (menu == 6) { //Laat de tijd zien die ingesteld is om het licht uit te laten gaan
Serial.println("licht uit na: ");
Serial.println(lichtTijd);
lcd.print("Licht uit na:");
lcd.setCursor(0, 1);
lcd.print(lichtTijd / 1000);
lcd.print(" seconden");
if (digitalRead(up) == HIGH ) { // Laat je de tijd omhoog instellen
lichtTijd += 1000;
}
if (digitalRead(down) == HIGH ) { // Laat je de tijd omlaag instellen
lichtTijd -= 1000;
}
}
}
void meetEnRegel() { //Alle stukken code die constant uitgelezen moeten worden
//Temparatuur regeling //
float h = dht.readHumidity(); //
float t = dht.readTemperature(); //
if (t <= VraagTemp - 2) { //Kijkt of de temperatuur onder de vraagtemperatuur zit en past dit wanneer nodig aan
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
Serial.print("het is onder de ");
Serial.print(VraagTemp - 2); //Zorgt ervoor dat de temperatuur niet precies hoeft te kloppen, is dus duurzamer want de verwarming/ventilator zijn niet de hele tijd elkaar aan het afwisselen
Serial.print(" graden : de verwarming gaat aan"); //
}
else {
digitalWrite(11, LOW);
}
if (t >= VraagTemp + 2) { //Kijkt of de temperatuur boven de vraagtemperatuur zit en past dit wanneer nodig aan
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
Serial.print("het is boven de ");
Serial.print(VraagTemp + 2); //Zorgt ervoor dat de temperatuur niet precies hoeft te kloppen, is dus duurzamer want de verwarming/ventilator zijn niet de hele tijd elkaar aan het afwisselen
Serial.print(" graden : de ventilator gaat aan");
}
else {
digitalWrite(12, LOW);
}
Serial.println();
Serial.print("LDR read: ");
Serial.print(analogRead(0));
unsigned long currentMillis = millis();
}
//PIR Sensor
unsigned long currentMillis2 = millis(); //Dit stukje leest de PIR sensor uit, en zet wanneer nodig het licht aan
if (lichtPushCounter == 1) { //Laat dit stukje alleen afspelen als het licht op automatisch staat
if (digitalRead(PIR) == HIGH) {
Serial.println();
Serial.println("Beweging gedetecteerd");
Serial.println("-------------------------");
Serial.println("Het Lamp Gaat/staat aan");
digitalWrite(Lamp, HIGH); //Zet het licht aan wanneer er beweging is gedetecteerd
previousMillisPirLedUit = currentMillis;
}
else {
Serial.println();
Serial.println("Geen beweging gedetecteerd: het Lamp staat uit of gaat over enkele minuten Uit"); //Zet het licht na een bepaalde tijd uit
if (currentMillis2 - previousMillisPirLedUit >= lichtTijd) {
digitalWrite(Lamp, LOW); //Zet het licht uit wanneer er een bepaalde tijd geen beweging is gedetecteerd
}
}
}
if (lichtTijd == 32000) { //Zorgt ervoor dat je niet in de min kunt gaan met het instellen van het licht of boven de 32000 komt wat de maximum delay waarde van de arduino is
lichtTijd = 0;
}
if (lichtTijd == -1000) {
lichtTijd = 31000;
}
if (digitalRead(Lamp) == LOW) {
Serial.println();
Serial.println("Het Licht staat uit");
}
//Luchtvochtigheid
if (h <= LVH - 5) {
Serial.println("luchtbevochtiger aan"); //Zet luchtbevochtiger aan wanneer het zoveel % onder de gewenste waarde zit
}
if (h >= LVH + 5) {
Serial.println("Lucht-ontvochtiger aan"); //Zet lucht-ontvochtiger aan wanneer het zovel % boven de gewenste waarde zit
}
}
void checkMenuKnop() {
// read the pushbutton input pin:
buttonState = digitalRead(BUTTON_N);
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
if (buttonPushCounter == 7) buttonPushCounter = 1;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
lcd.clear();
} else {
// if the current state is LOW then the button
// went from on to off:
Serial.println("off");
}
// Delay a little bit to avoid bouncing
delay(50);
}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;
}
Een paar opmerkingen, ik zet ze hier neer in de volgorde waarin ik ze tegen kom.
Ik krijg overigens foutmeldingen over het ontbreken van een Adafruit_Sensor.h, wat ergens in een van de libraries (2 stuks) zit die ik via de manager hiervoor heb geïnstalleerd.
Ik heb dat niet kunnen terugvoeren naar een correcte library waar dat dan weer een onderdeel van zou moeten zijn, maar ik ga daar ook niet hemel en aarde voor bewegen.
Helaas stopt daarmee de compiler wel en zie ik geen andere foutmeldingen (voor zover die er zouden zijn) meer.
Je roept iets over constanten en gaat vervolgens 9 ints declareren, die daarmee dus variabelen worden.
Variabelen die eigenlijk constanten zijn nemen onnodig geheugen van je Arduino in beslag.
Een const neemt geen Arduino geheugen in beslag, alleen op je computer en in de IDE.
De buttonPushCounter word met de waarde nul aangemaakt, maar een stuk verderop op 1 gezet omdat je daar mee wil beginnen; dat kan effectiever.
In regels 44 en 46 doe je 2 keer hetzelfde, en declareer je dubbel.
Onnodig en onoverzichtelijk en bovendien niet toegestaan, ik weet niet zeker of de IDE er over zal klagen.
De namen voor je variabelen gaan alle kanten op:
De ene keer alles in hoofdletters, dan beginnen ze met hoofdletters, of het is een afkorting in hoofdletters, en dan weer niet maar wel elk woord met een hoofdLetter.
Niet netjes en niet overzichtelijk.
Er zit een bom in je code (maar of die ooit zal afgaan ?) tijdens setup.
Als er daar lang genoeg geteld is, dan zal de code gaan hangen en helemaal niets meer doen.
Geen idee wat daar de bedoeling van is.
In regel 78 en in regel 93 doe je 2 keer hetzelfde
Je teller voor de loop begint bij nul, gaat dan naar 1, zal dat via de seriële verbinding laten zien, en gaat dan naar 2.
Verder gaat ie niet want er is geen loop daar.
Das een mooi lijstje van opmerkingen, maar het verklaart de foutmeldingen niet.
Helaas kan ik je er niet verder mee helpen (heb je deze code bijgewerkt voor je 'm plaatste toevallig ?), omdat de IDE hier dus op de missende library blijft hangen en niet verder lijkt te gaan.
Tijdens het typen ging er daarnet iets fout (geen idee wat), waardoor het edit scherm sloot.
Dus heb ik een draft opgedoken, maar weet nu niet of er daardoor een stuk is weggevallen.
Maar ben nu al lang genoeg voor vandaag met jouw vraagstuk bezig, dus voor nu laat ik het er even bij.
Ik heb je twee stukjes code even gekopieerd naar een sketch and vervolgens in the IDE menu -> tools -> auto format er op los gelaten.
Het resultaat is dat er statements zijn die beginnen aan het begin van een regel en dat duidt op een fout met { en }.
}
//PIR Sensor
unsigned long currentMillis2 = millis(); //Dit stukje leest de PIR sensor uit, en zet wanneer nodig het licht aan
if (lichtPushCounter == 1) //Laat dit stukje alleen afspelen als het licht op automatisch staat
{
De '}' is het eind van de meetEnRegel.
PS
Je kunt je code bijvoegen als aanhangsel (attachment); dan weet je zeker dat anderen niet verkeerd kopieren en plakken