HELP: Actie uitvoeren op bepaald uur

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 23 Mei 2016, 12:23

shooter schreef: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.



Moest het me op die manier lukken ben ik ook al tevreden, zolang de lamp of de taak maar aangaat of uitgevoerd wordt op juiste tijdstip…

Ik neem aan dat ik de tijd uit de RTC haal met het commando:
Code: Alles selecteren
  DateTime now = rtc.now();
klopt dat? Of doe ik dat met deze code, want dat is het enige dat me niet duidelijk is in men code…
Code: Alles selecteren
 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


Sorry voor de vele vragen hoor… en allemaal bedankt voor de vele tips en hulp!

Advertisement

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor Krikke » 23 Mei 2016, 12:25

nicoverduin schreef:Maar waarom zou je in dagalarm een delay aanroepen?


Dat was eigenlijk maar voor testdoeleinden :) eenmaal de functie aangeroepen wordt kan ik daar verder met code..

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:30

Er is niets mis met testdoeleinden... Als je weet wat je test, waarom en de code begrijpt......
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, 21:56

Ok, ik wil dus alle delays weg… maar wel text langer dan een flits op het LCD wil krijgen… dus dacht ik van zelf een timer ofzo te gaan maken die ik dan oproep ipv de Delay ? Is dit een juiste denkpiste of zit ik helemaal mis nu, aub?

Code: Alles selecteren
void textTimer() {
  Serial.println("texttimer");

 // unsigned long previousMillis = 0;       
  unsigned long currentMillis = millis();

  const long interval = 50000;

  if (currentMillis - previousMillis >= interval) {
      Serial.println("milis lopen");

    previousMillis = currentMillis;
  }
}

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 24 Mei 2016, 07:46

Nope
Het hele concept is dat je alleen iets moet doen als dat nodig is. Nu zit je nog steeds te wachten.
Een timer doe je als volgt:
cpp code
#define DUUR 5000     // we laten de timer 5 seconden lopen
uint32_t timer;


in de setup():
cpp code
timer = 1;               // dit doe ik omdat 0 een speciale functie heeft. Namelijk dat hij niet loopt als deze 0 is

in de loop()
cpp code
if (timer != 0) {                // hij loopt dus
if (millis() - timer > DUUR) {
//
// de timer is verlopen dus doe wat er moet gebeuren
//

//
// als je de timer weer opnieuw wil laten lopen dan de timer weer zetten. Anders op 0 zetten
// hier zet ik hem dus uit
//
timer = 0;
}
}


Als je dus wilt dat er iets op het display blijft staan dan zet je standaard de timer op 0 in de setup. Komt er dan een situatie voor die iets voor langere duur op het display moet zetten dan kun je dat doen en daarna de timer zetten gelijk aan millis. Deze loopt dan. In bovenstaande code wordt er elke keer getest of de timer verlopen is en of deze is verlopen. Zo niet gaat de code verder zonder te wachten. Op deze wijze kun je een beetje pseudo realtime creëren omdat het programma ergens staat te wachten maar elke keer af test of het iets moet doen.
Dat is ook de reden waarom ik telkens weer aandring dat men eerst het programma ontwerp maakt. Dus op papier ff uitwerken van de verschillende stadia waarin een programma zich kan bevinden.
Ook de flow van een programma kun je op die manier uitvoeren als volgt. Dit programma laat even 3 korte en 3 lange flitsen zien zonder delays. En het kan nog veel efficienter maar dat is in dit geval bewust even weggelaten. De essentie is dat je de loop door verschillende stappen code loopt en nergens staat te wachten.

cpp code
#include "Arduino.h"
#define LED 13

#define DUUR_1 150
#define DUUR_2 750

enum { // verschillende stappen in een programma
stap_1,
stap_2,
stap_3
};

uint32_t timer; // timers in dit voorbeeld
uint8_t stap = stap_1; // stap binnen het programma
uint8_t ctr; // tellertje om aantal flitsen te bepalen

void setup(){
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
//
// zet de timers uit
//
timer = 0;
}
void loop(){
switch (stap) {
case stap_1:
//
// kijk of timer loopt
//
if (timer == 0) {
//
// nee dus start de timer en reset een teller
//
timer = millis();
ctr = 0;
} else {
//
// hij loopt dus kijk of deze is verlopen
//
if (millis() - timer > DUUR_1){
//
// ja dus flip LED
//
digitalWrite(LED, !digitalRead(LED));
//
// verhoog onze ctr
//
ctr++;
//
// check of we klaar zijn met flitsen
//
if (ctr == 6) { // hebben we 3 x aan-uit gehad?
//
// en ga naar de volgende stap
//
stap++;
timer = 0;
} else {
//
// start de timer opnieuw
//
timer = millis();
}
}
}
break;

case stap_2:
//
// kijk of timer loopt
//
if (timer == 0) {
//
// nee dus start de timer en reset een teller
//
timer = millis();
ctr = 0;
} else {
//
// hij loopt dus kijk of deze is verlopen
//
if (millis() - timer > DUUR_2){
//
// ja dus flip LED
//
digitalWrite(LED, !digitalRead(LED));
//
// verhoog onze ctr
//
ctr++;
//
// check of we klaar zijn met flitsen
//
if (ctr == 6) { // hebben we 3 x aan-uit gehad?
//
// 3 dashes zijn getoond
//
timer = 0; // timer uitzetten
//
// en ga naar de volgende stap
//
stap++;
} else {
//
// zet de timer opnieuw
//
timer = millis();
}
}
}
break;

case stap_3:
//
// de laatste stap zorgt dat we weer naar de eerste stap gaan
//
stap = stap_1;
break;

}
}
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 » 24 Mei 2016, 20:26

Men programmeren begint beter en beter te lukken :) ik had het vannacht al opgelost op een soortgelijke manier als jou onderstaande… bedankt voor al jullie tips…
de code nog een beetje nakijken, maar ik ben best tevreden en het werkt! :)

En dan… starten aan het echte werk: het klimaat voor men gifkikkers programmeren :)


cpp code
#include <Time.h>  
#include <DS1307RTC.h> //RTC DS1307 library that returns time as a time_t
#include <Wire.h> //Needed for IIC (I2C) comunications
#include <TimeAlarms.h> //Changed Number of alarms dtNBR_ALARMS to 30
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>; // temp hum sensor


//
//**************************************************************************
//Global Variable Section
//

#define DS1307_ID 0x68 //Address of the RTC
RTC_DS3231 rtc;
//SENSOR
#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


/*-----( 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

/* 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


//time_t t = now(); //Used for RTC time correction at midnight

// Settings ldc screens on display
long previousLCDMillis = 0; // for LCD screen update
long lcdInterval = 4000;
// screen to show
int screen = 0;
int screenMax = 2;
bool screenChanged = true; // initially we have a new screen, by definition

// defines of the screens to show
#define DAYTIME 0
#define HUMIDITY 1
#define TIME 2




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" };

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


//
//##########################################################################
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% S E T U P ( ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//##########################################################################
//
void setup()
{
//***** Initialization *****
Serial.begin(9600);
lcd.begin(16, 2); // initialize the lcd for 16 chars 2 lines, turn on backlight
// rtc.begin(); // Enables the RTC



//Check to see if the RTC is present. Set the clock accordingly
Wire.beginTransmission(DS1307_ID);
Wire.write((uint8_t)0x00);
//**********************
if (Wire.endTransmission() == 0) //Did the RTC respond?
{
setSyncProvider(RTC.get); //Yes it did, get the time from the RTC
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Datum en tijd instellen
Serial.print("setsync ok RTC");

}
else //No it didn't, set the clock from this code
{
Serial.print("FOUT RTC");
//setTime(9,14,50,8,9,13); //Hour,Minute,Second,Day,Month,Year
//setTime(12,19,55,7,12,13); //Hour,Minute,Second,Day,Month,Year
//setTime(1354532395); //Can also use EPOCH Time to set the clock
}

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

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

//
//**************************************************************************
//Define all Periodic Alarms
// ! ! ! ! I M P O R T A N T ! ! ! !
//Changed Number of alarms dtNBR_ALARMS in TimeAlarms.h for # of alarms: NOW AT 30
//# of alarms * 11 = RAM bytes necessary 30*11=330 RAM Locations. Maximum is 255 Alamrs

//##########################################################################
//%%%%%%%%%%%%%%%%%%%%%%%%% ALARM INSTELLEN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//##########################################################################
//Daily Alarms Alarm ##
Alarm.alarmRepeat(11,57,0, AlarmDagmodus); //
Alarm.alarmRepeat(11,56,0, AlarmNachtmodus); //

//Alarm.alarmRepeat(dowSunday,9,15,0, AlarmChurch); //
OpstartenSchermBoodschap();

}
// END of Setup()


//
//##########################################################################
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% L O O P ( ) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//##########################################################################
//
void loop()
{
//********************** Update the Arduino clock to the RTC at midnight
if(hour()==0 && minute()==0 && second()==0) //If it is 00:00:00 update the Clock
{
setSyncProvider(RTC.get); //It's time, sync the Clock to the RTC
}
//**********************

//digitalClockDisplay(); //Update the Clock Display

// Alarm.delay(1000); // Wait 1000mS then start the LOOP again

ReadSensors();
// DisplayHumTemp();

selectScreenToDisplay();


} // End of Loop()

//
//##########################################################################
//%%%%%%%%%%%%%%%%%%%%%%%%%% F U N C T I O N S %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//##########################################################################

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(3000);
lcd.clear();

}

void selectScreenToDisplay(){
unsigned long currentLCDMillis = millis();

// MUST WE SWITCH SCREEN?
if(currentLCDMillis - previousLCDMillis > lcdInterval) // save the last time you changed the display
{
previousLCDMillis = currentLCDMillis;
screen++;
if (screen > screenMax) screen = 0; // all screens done? => start over
screenChanged = true;
}
// DISPLAY CURRENT SCREEN
if (screenChanged) // only update the screen if the screen is changed.
{
screenChanged = false; // reset for next iteration
switch(screen)
{
case DAYTIME:
lcd.clear();
lcd.print("DAGMODUS ok");
break;
case HUMIDITY:
DisplayHumTemp();
break;
case TIME:
digitalClockDisplay(); //Update the Clock Display
break;
default:
// cannot happen -> showError() ?
break;
}
}



}


//
//***********************************************
//Function to Display Time and Date
void digitalClockDisplay(void)
{
DateTime now = rtc.now();
lcd.clear();
lcd.setCursor(0, 0); //Start at character 0 on line 0
lcd.print(hour());
printDigits(minute());
//printDigits(second());
// lcd.println("");
lcd.setCursor(0, 1);
// lcd.print(dayStr(weekday()));
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(" ");
lcd.print(day());
lcd.print(" ");
lcd.print(maanden[now.month()]);
//lcd.println(year());
}

//
//***********************************************
//Function for digital clock display: prints preceding colon and leading 0
//
void printDigits(int digits)
{
lcd.print(":");
if(digits < 10)
{
lcd.print('0');
}
lcd.print(digits);
}

//Functions called when an alarm triggers:
//***********************************************

///Dagmodus Alarm
void AlarmDagmodus()
{
Serial.println("DAGMODUS - Lichten AAN, Luchtvochtigheid lager, temperatuur omhoog");
lcd.clear();
lcd.print("DAGMODUS AAN");
Alarm.delay(3000);
lcd.backlight();

}

//***********************************************
//Nachtmodus Alarm
void AlarmNachtmodus()
{
Serial.println("Alarm: - turn lights on");
lcd.clear();
lcd.print("NACHTMODUS AAN");
Alarm.delay(3000);
lcd.noBacklight();


}

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

void DisplayHumTemp(){
// output temp en hum scherm
lcd.clear();
lcd.print("Vocht: ");
// lcd.print(dht.readHumidity());
lcd.print(hum);

lcd.print(" %");
lcd.setCursor(0, 1); // set cursor to column 0, row 1
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" Cel.");
}
//***********************************************
///

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 24 Mei 2016, 21:51

Wel eens gedacht om met een wat geavanceerdere omgeving te werken? Eclipse + Arduino plugin is een stuk professioneler. En met Eclipse kun je ook gelijk SVN (versiebeheer) en Doxygen (documentatie) toevoegen. Pas je doxygen toe kun je van je programma automatisch een complete website genereren van jouw programma. Hier een voorbeeld: http://malawi.verelec.nl
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 26
Geregistreerd: 22 Dec 2015, 13:40
Woonplaats: Zandvoort

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor marc verlooy » 25 Mei 2016, 17:34

Daar heb je mij weer met mijn GPS-module om de juiste tijd te verkrijgen: Koppel een GPS-Module aan je Arduino en je krijgt de beschikking over de atoomtijd. Tot op de nanoseconde nauwkeurig!!

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

Re: HELP: Actie uitvoeren op bepaald uur

Berichtdoor nicoverduin » 25 Mei 2016, 17:58

En wat schiet je daarmee op bij een eenvoudige meting voor een beetje vochtgehalte en temperatuur? Behalve voor de extra kosten van een GPS module. Daarnaast is het moment dat jij de tijd binnen krijgt afwijkend van de werkelijke tijd. Je loopt altijd achter omdat de transmissietijd over de serial. Dus dan moet je weer truken om dat te compenseren. Maar ik denk dat die spinnen, slangen of hagedissen die erin zitten het weinig uit zal maken. De TS kwam met een verschil in waarneming omdat ondanks het alarm er altijd wel een paar seconden verschil in zat. voordat hij de tijd toonde. Oorzaak was het gebruik van delay() en recursief Alarm.delay(). Zelfs met de GPS had hij dit probleem gehad omdat de GPS wel nauwkeurig is als ook die RTC (zij het minder) maar de code was gewoon te laat om te reageren door de delays.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Vorige

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten