HELP: Actie uitvoeren op bepaald uur

algemene C code
Berichten: 8
Geregistreerd: 22 Mei 2016, 20:51

HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 22 Mei 2016, 23:00

Hallo allemaal… ik ben pas begonnen met Arduino en het leek me interessant om er een terrarium controller van te maken… een simpele versie weliswaar.
Nu loop ik al ganse dag vast op iets waarvan ik dacht dat het heel eenvoudig zou moeten zijn: Het aanschakelen van de lampen op een bepaald tijdstip.. dus eigenlijk gewoon een relais laten schakelen op een bepaald uur. Na veel zoeken vond ik de Alarm.alarmrepeat functie en die zou moeten doen wat ik verwacht… alleen: als ik een alarm instel op een bepaald uur bijvoorbeeld 20:30 dan kan het zijn dat deze lijn pas gelezen wordt om 20:30:03 seconden… waardoor er dus geen enkele actie gebeurd…

Kan er iemand mij op weg helpen aub?? Hieronder vind je mijn code… er staat nog een heel deel in van de timer en er is nog niks opgekuist maar ik zou graag weten waar ik moet zoeken om mijn lichten aan te laten gaan op een vooraf bepaald uur.


cpp code
/*-----( Import needed libraries )-----*/
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <DHT.h>; // temp hum sensor
#include <RTClib.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <TimeLib.h>
#include <Time.h>
#include <TimeAlarms.h>

/*-----( Declare Constants )-----*/
//Constants
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = { "Zondag", "Maandag", "Dinsdag", "Woensdag",
"Donderdag", "Vrijdag", "Zaterdag" };
char maanden[13][13] = { "nulmaand", "januari", "februari", "maart", "april",
"mei", "juni", "juli", "augustus", "september", "oktober", "november",
"december" };

const float MaximumTempDay = 24.0;
const float MinimumTempDay = 21.0;
const float MaximumTempNight = 22.00;
const float MinimumTempNight = 20.0;
const float MinimumHumNight = 90.0;
const float MinimumHumDay = 80.0;
const float MaximumHumNight = 99.0;
const float MaximumHumDay = 85.0;

/* Relay Module. */

// define names for the 4 Digital pins On the Arduino 7,8,9,10
// These data pins link to 4 Relay board pins IN1, IN2, IN3, IN4
#define REGEN 7 // SPROEINSTALLATIE 1
#define VENTILATIE 8 // VENTILATIE 2
#define MIST 9 // MIST 3
#define VERWARMING 10 // VERWAMINGSMAT 4

/*-----( Declare objects )-----*/

// set the LCD address to 0x27 for a 16 chars 2 line display
// A FEW use address 0x3F
// Set the pins on the I2C chip used for LCD connections:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

/*-----( Declare Variables )-----*/
//int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
boolean isDag; //= true;

void setup() /*----( SETUP: RUNS ONCE )----*/

{
Serial.begin(9600); // Used to type in characters

// create the alarms
Alarm.alarmRepeat(22, 25, 0, MorningAlarm); // 8:30am every day
Alarm.alarmRepeat(22, 27, 0, EveningAlarm); // 5:45pm every day

dht.begin();
rtc.begin(); // Enables the RTC
lcd.begin(16, 2); // initialize the lcd for 16 chars 2 lines, turn on backlight

setSyncProvider(RTC.get); // the function to get the time from the RTC
if (timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");

rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Datum en tijd instellen

// Initialise the Arduino data pins for OUTPUT
pinMode(REGEN, OUTPUT);
pinMode(MIST, OUTPUT);
pinMode(VERWARMING, OUTPUT);
pinMode(VENTILATIE, OUTPUT);

// ------- Quick 3 blinks of backlight -------------
for (int i = 0; i < 3; i++) {
lcd.backlight();
Alarm.delay(200);
lcd.noBacklight();
Alarm.delay(200);
}
lcd.backlight(); // finish with backlight on

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0
lcd.setCursor(0, 0); //Start at character 4 on line 0
lcd.print("Krikke's");
// Alarm.delay(1000);
lcd.setCursor(0, 1);
lcd.print("Terrarium");
Alarm.delay(8000);

} /*--(end setup )---*/

void loop() /*----( LOOP: RUNS CONSTANTLY )----*/

{

digitalClockDisplay();
// Alarm.delay(1000); // wait one second between clock display

//Read data and store it to variables hum and temp
hum = dht.readHumidity();
temp = dht.readTemperature();
DateTime now = rtc.now();

// Send Day-of-Week
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tijd: ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
//lcd.print("u.");
//lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.print(maanden[now.month()]);
// Wait 3 second before repeating :)
Alarm.delay(2000);

// output temp en hum scherm
lcd.clear();
lcd.print("Vocht: ");
lcd.print(dht.readHumidity());
lcd.print(" %");
lcd.setCursor(0, 1); // set cursor to column 0, row 1
lcd.print("Temp: ");
lcd.print(dht.readTemperature());
lcd.print(" Cel.");
Alarm.delay(3000); //Delay 3 sec.
lcd.clear();

if (isDag) {

lcd.clear();
lcd.print("DAGMODUS AAN");
Alarm.delay(3000); //Delay 3 sec.

if (temp > MaximumTempDay) {
digitalWrite(VENTILATIE, HIGH); //Relay 3 switches to NO VERLUCHTING
lcd.clear();
lcd.print("Temp. te hoog!");
lcd.setCursor(0, 1);
lcd.print("Verluchting aan.");
Alarm.delay(3000);
lcd.clear();
}

else {
digitalWrite(VENTILATIE, LOW); //Relay 3 switches to NC
//digitalWrite(RELAY4,HIGH); //Relay 3 switches to NC
Alarm.delay(1000);
}

}

else

{
lcd.clear();
lcd.print("NACHTMODUS");
Alarm.delay(3000); //Delay 3 sec.
}

// functions to be called when an alarm triggers:
}

void MorningAlarm() {
isDag = true;
lcd.println("Alarm: - DAG");
Serial.println("Alarm: - turn lights on");

Alarm.delay(2000);
}

void EveningAlarm() {
isDag = false;
lcd.noBacklight();

lcd.println("Alarm: - NACHT");
Serial.println("Alarm: - turn lights off");

Alarm.delay(2000);

}
///* --(end main loop )-- */
/* ( THE END ) */

// functions to be called when an alarm triggers:
void WeeklyAlarm() {
Serial.println("Alarm: - its Monday Morning");
}

void ExplicitAlarm() {
Serial.println("Alarm: - this triggers only at the given date and time");
}

void Repeats() {
Serial.println("15 second timer");
}

void OnceOnly() {
Serial.println("This timer only triggers once");
}

void digitalClockDisplay() {
// digital clock display of the time
Serial.print(hour());
printDigits (minute());printDigits
(second());Serial
.println();
}

void printDigits(int digits) {
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 22 Mei 2016, 23:53

Die vertragingen die je krijgt komt omdat je gebruik maar van delay(). Op dat moment doet de processor niets anders dan wachten tot het voorbij is. De oplossing is om delays te vervangen door timers. Als je de sketch blink without delay bekijkt kun je goed zien hoe dat werkt. Verder zou ik de loop opschonen omdat dat je code ten goed komt als ook het overzicht erin. Het lezen van de temperatuur en humidity kun je in een functie doen. Het tonen op het display idem. En als je al een functie aanroept doe het alleen als het nodig is. Als je dat allemaal realiseert heb je grote kans dat de loop 10000 x per seconde uitgevoerd wordt waardoor je vertraging eveneens weg is.
En roep tevens de format aan in de IDE (CTRL-T). Ik heb het nu ff voor jou gedaan en je code daarna weer teruggezet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 133
Geregistreerd: 10 Jan 2016, 16:39

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Nightmystic » 23 Mei 2016, 01:39

Ik heb nog steeds veel moeite om echt te snappen hoe het nu precies werkt met deze timer concepten.

Ondanks zelfs deze ogenschijnlijk heldere uitleg:
https://www.baldengineer.com/millis-cookbook.html

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 23 Mei 2016, 05:57

Nightmystic schreef:Ik heb nog steeds veel moeite om echt te snappen hoe het nu precies werkt met deze timer concepten.

Ondanks zelfs deze ogenschijnlijk heldere uitleg:
https://www.baldengineer.com/millis-cookbook.html
veel oefenen :mrgreen:
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 8
Geregistreerd: 22 Mei 2016, 20:51

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 23 Mei 2016, 10:20

nicoverduin schreef:Die vertragingen die je krijgt komt omdat je gebruik maar van delay(). Op dat moment doet de processor niets anders dan wachten tot het voorbij is. De oplossing is om delays te vervangen door timers. Als je de sketch blink without delay bekijkt kun je goed zien hoe dat werkt. Verder zou ik de loop opschonen omdat dat je code ten goed komt als ook het overzicht erin. Het lezen van de temperatuur en humidity kun je in een functie doen. Het tonen op het display idem. En als je al een functie aanroept doe het alleen als het nodig is. Als je dat allemaal realiseert heb je grote kans dat de loop 10000 x per seconde uitgevoerd wordt waardoor je vertraging eveneens weg is.
En roep tevens de format aan in de IDE (CTRL-T). Ik heb het nu ff voor jou gedaan en je code daarna weer teruggezet.


Thx Nico, ik had ook al iets gelezen van de Delay te vervangen door Alarm.alarmDelay maar dit gaf ook niet het gewenste resultaat… :/ Ik zal al eens beginnen met de code wat proberen op te splitsen in functies… dan ben ik ook weer even bezig :) Alle begin is moeilijk zeker :)

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 23 Mei 2016, 10:37

Veel doen, goed over nadenken en structuur aanbrengen (in het begin is het het beste om gewoon een paar vellen papier te gebruiken), scheutig zijn met commentaar en netjes uitlijnen dan heb je al 75% van het werk. Coderen is niet meer dan je programma ontwerp vertalen in een programmeertaal.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor shooter » 23 Mei 2016, 10:46

Is zelfs voor ons best moeilijk hoor, om code te ontrafelen die iemand geschreven heeft.
en als het dan door jou gekopieerd is dan wordt het helemaal zoeken,
begin eens met een basis.
haal de RTC tijd op en kijk of de lamp aan moet zijn: if time>8:00 && time <20:00 dan lamp aan
else lamp uit bijv.

dan heb je het zelf geschreven en leer je ook nog iets beter dan code kopieren en niet snappen wat er staat.
paul deelen
shooter@home.nl

Berichten: 8
Geregistreerd: 22 Mei 2016, 20:51

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 23 Mei 2016, 11:22

Hey Shooter… ik begrijp wat je bedoelt hoor, maar wat er staat snap ik wel grotendeels… het is niet zo dat ik gewoon knip en plak zonder na te denken…
Probleem is dat die Alarm.alarmrepeat niet wil werken… Ik ben nu de code een beetje aan het opkuisen maar omdat ik toch nog veel knoei heeft dat nog weinig zin…

tijd uit RTC halen is toch gewoon met DateTime now = rtc.now(); of vergis ik me?
Als ik het voorbeeld gebruik uit de IDE werkt het wel… maar dan zijn er ook geen andere taken die vertraging opleveren…

Berichten: 8
Geregistreerd: 22 Mei 2016, 20:51

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 23 Mei 2016, 12:08

Ik heb ondertussen geprobeerd om een beetje op te kuisen :) Het enige probleem waar ik zou doormoeten zijn die Alarm.alarmreapeat alarms die moeten werken en die doen het dus niet…

cpp code
/*-----( Import needed libraries )-----*/
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
#include <DHT.h>; // temp hum sensor
#include <RTClib.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <TimeLib.h>
#include <Time.h>
#include <TimeAlarms.h>

/*-----( Declare Constants )-----*/
//Constants
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {
"Zondag", "Maandag", "Dinsdag", "Woensdag",
"Donderdag", "Vrijdag", "Zaterdag" };
char maanden[13][13] = {
"nulmaand", "januari", "februari", "maart", "april",
"mei", "juni", "juli", "augustus", "september", "oktober", "november",
"december" };

const float MaximumTempDay = 24.0;
const float MinimumTempDay = 21.0;
const float MaximumTempNight = 22.00;
const float MinimumTempNight = 20.0;
const float MinimumHumNight = 90.0;
const float MinimumHumDay = 80.0;
const float MaximumHumNight = 99.0;
const float MaximumHumDay = 85.0;

/* Relay Module. */
// define names for the 4 Digital pins On the Arduino 7,8,9,10
// These data pins link to 4 Relay board pins IN1, IN2, IN3, IN4
#define REGEN 7
#define VENTILATIE 8
#define MIST 9
#define VERWARMING 10

/*-----( Declare objects )-----*/

// set the LCD address to 0x27 for a 16 chars 2 line display
// A FEW use address 0x3F
// Set the pins on the I2C chip used for LCD connections:
// addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

/*-----( Declare Variables )-----*/
float hum; //Stores humidity value
float temp; //Stores temperature value
boolean isDag= true;



void setup() /*----( SETUP: RUNS ONCE )----*/

{
Serial.begin(9600); // Used to type in characters

// create the alarms
Alarm.alarmRepeat(22, 25, 0, MorningAlarm); // alarm ochtend
Alarm.alarmRepeat(22, 27, 0, EveningAlarm); // alarm avond

dht.begin();
rtc.begin(); // Enables the RTC
lcd.begin(16, 2); // initialize the lcd for 16 chars 2 lines, turn on backlight

setSyncProvider(RTC.get); // the function to get the time from the RTC
if (timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");

rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Datum en tijd instellen

// Initialise the Arduino data pins for OUTPUT
pinMode(REGEN, OUTPUT);
pinMode(MIST, OUTPUT);
pinMode(VERWARMING, OUTPUT);
pinMode(VENTILATIE, OUTPUT);

OpstartenSchermBoodschap();

} /*--(end setup )---*/


void loop() /*----( LOOP: RUNS CONSTANTLY )----*/

{
ReadSensors();
DisplayTimeDate();
DisplayHumTemp();

if (isDag) {

lcd.clear();
lcd.print("DAGMODUS AAN");
Alarm.delay(3000); //Delay 3 sec.

if (temp > MaximumTempDay) {
digitalWrite(VENTILATIE, HIGH); //Relay 3 switches to NO VERLUCHTING
lcd.clear();
lcd.print("Temp. te hoog!");
lcd.setCursor(0, 1);
lcd.print("Verluchting aan.");
Alarm.delay(3000);
lcd.clear();
}

else {
digitalWrite(VENTILATIE, LOW); //Relay 3 switches to NC
//digitalWrite(RELAY4,HIGH); //Relay 3 switches to NC
Alarm.delay(1000);
}

}

else

{
lcd.clear();
lcd.print("NACHTMODUS");
Alarm.delay(3000); //Delay 3 sec.
}

}


///* --(end main loop )-- */



/// EIGEN FUNCTIES

void OpstartenSchermBoodschap(){
// ------- Quick 3 blinks of backlight -------------
for (int i = 0; i < 3; i++) {
lcd.backlight();
Alarm.delay(200);
lcd.noBacklight();
Alarm.delay(200);
}
lcd.backlight(); // finish with backlight on

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0
lcd.setCursor(0, 0); //Start at character 4 on line 0
lcd.print("Krikke's");
// Alarm.delay(1000);
lcd.setCursor(0, 1);
lcd.print("Terrarium");
Alarm.delay(8000);

}


void ReadSensors() {
//Read data and store it to variables hum and temp
hum = dht.readHumidity();
temp = dht.readTemperature();
}


void DisplayTimeDate() {
DateTime now = rtc.now();

// Send Day-of-Week
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tijd: ");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
//lcd.print("u.");
//lcd.print(now.second(), DEC);
lcd.setCursor(0, 1);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.print(maanden[now.month()]);
// Wait 3 second before repeating <img src="./images/smilies/icon_e_smile.gif" alt=":)" title="Smile">
Alarm.delay(2000);
}

void DisplayHumTemp(){
// output temp en hum scherm
lcd.clear();
lcd.print("Vocht: ");
lcd.print(dht.readHumidity());
lcd.print(" %");
lcd.setCursor(0, 1); // set cursor to column 0, row 1
lcd.print("Temp: ");
lcd.print(dht.readTemperature());
lcd.print(" Cel.");
Alarm.delay(3000); //Delay 3 sec.
lcd.clear();
}

// functions to be called when an alarm triggers:

void MorningAlarm() {
isDag = true;
lcd.println("Alarm: - DAG");
Serial.println("Alarm: - turn lights on");

Alarm.delay(2000);
}

void EveningAlarm() {
isDag = false;
lcd.noBacklight();

lcd.println("Alarm: - NACHT");
Serial.println("Alarm: - turn lights off");

Alarm.delay(2000);

}


/// EINDE EIGEN FUNCTIES

/* ( THE END ) */

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 23 Mei 2016, 12:17

Nou die delay staat net zo hard stil als de gewone delay.
Dit is de code:
cpp code
void TimeAlarmsClass::delay(unsigned long ms)
{
unsigned long start = millis();
while( millis() - start <= ms)
serviceAlarms();
}


Ook al probeert hij eventuele alarmen uit te voeren via een call back. en daar zit denk ikook een beetje het probleem als ik de code begrijp.

Stel een alarm gaat af. Bijvoorbeeld dagAlarm
a) de callback naar dag alarm wordt aangeroepen
b) daarbinnen roep jij weer een delay aan waardoor weer serviceAlarms wordt aangeroepen
c) en weer wordt de callback aangeroepen. Dus een beetje recursief

Maar waarom zou je in dagalarm een delay aanroepen?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten