Timer programma werkt niet.

Arduino specifieke Software
Berichten: 3
Geregistreerd: 18 Apr 2017, 08:44

Timer programma werkt niet.

Berichtdoor Pedro71 » 19 Apr 2017, 13:32

Beste forumleden,

Als nieuweling op dit forum zou ik jullie willen vragen naar het volgende te kijken.
Ik ben bezig een stukje programma te maken dat ik op een bepaalde tijdinterval zou willen uitvoeren namelijk,

ik wil om de 15 minuten een actie starten om dit voor elkaar te krijgen heb ik een puls bedacht welke nadat hij is geactiveerd 1 cyclus
1 blijft en vervolgens wordt gereset om na 15 minuten een niuwe puls te geven etc.

Deze puls moet vervolgens een actie starten namelijk een meting welke 1 minuut duurt, nadat deze meting gereed is wordt er indien nodig een aantal uitgangen aangestuurd
ook weer vor een bepaalde tijd.

nu krijg ik deze diverse tijdcyclussen niet werkend, de logica welke afgehandeld moet worden werkt al wel dus die is nu niet toegevoegd.

uiteindelijk is de bedoeling dat deze besturing gebruikt gaat worden om planten water te geven in een hobbykas, alle hardware werkt al nu echter de logica nog.

Op voorhand al dank voor het meedenken.

Code: Alles selecteren
//eerst setup

#define VERTRAG_SPROEI  5000  // vertraginstijd is hier 5 seconden
#define VERTRAG_MEAS   60000  // vertraginstijd is hier 60 seconden
#define VERTRAG_cycl  900000  // voor 15 minuten timer 900.000 = 15minuten
unsigned long timer_15MIN;  // vertragingstimer
unsigned long timer_1MIN; // vertragingstimer
unsigned long timer_current;    // t.b.v bepalen overflow


boolean Overflow=false;    // Memory voor overflow
boolean Time1=false;       // voor 15 minuten puls
boolean Pulse1=false;      // puls als 15 minuten timer is verlopen.
boolean Time2=false;       // voor 1 minuut puls
boolean Pulse2=false;      // puls als 1 minuut timer is verlopen.
boolean Meas=false;        // bit actief tijdens meetcyclus.


void setup() {

 timer_15MIN=0;   // TIMER OP 0 ZETTEN
 timer_1MIN=0;    // TIMER OP 0 ZETTEN
 timer_current=0; // overflow geheugen op 0 zetten

 
Serial.begin(9600);// voor serial monitor.
}

void loop() {
//eventueel overflow bepalen.

if (millis()< timer_current) {Overflow=true;}                                      //overflow bepalen
else  (millis()> timer_current) {(timer_current=millis());(Overflow=false);}     // indien geen overflow actuele milis waarde schrijven


//vervolgens om de 15 minuten een puls maken (Pulse1)

if (Pulse1=true) {

Pulse1=false;
Time1=false;
}                               //puls is 1 cyclus hoog geweest reset puls en set timer opnieuw.

if (Time1=false) {
timer_15MIN=timer_current+VERTRAG_cycl;
Time1=true;                   //900.000 = 15minuten



if (timer_15MIN < timer_current) {Pulse1=true;}

// meet cyclus starten.
// 15 minuten puls start 1 minuut meettijd

if (Pulse1=true) {Meas=true;}   //
if (Meas=true) {
 
if (Pulse2=true) {Pulse2=false;Time2=false;}                               // puls is 1 cyclus hoog geweest reset puls en set timer opnieuw.
if (Time2=false) {(timer_1MIN=timer_current+VERTRAG_MEAS);(Time2=true);}   // 60000 = 1 minuten
if (timer_1MIN < timer_current) {Pulse2=true;}
 
//meetcyclus uitvoeren


 
if (Pulse2=true) {Meas=false;}   // einde meetcyclus
  }

// meetcyclus is voorbij indien nodig uitgang aansturen
if (Meas=false) {
 
 
  ;}



//uitvoering groep 1


//uitvoering groep 2


//uitvoering groep 3

//uitvoering groep 4

//reset uitvoeringsbit
//en wacht op volgende cyclus.

}



Advertisement

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

Re: Timer programma werkt niet.

Berichtdoor Koepel » 19 Apr 2017, 13:57

Hallo, welkom op dit forum.

Zou je het opnieuw willen doen ? En ons de nieuwe sketch laten zien.

De basis van het gebruik van millis() is de "Blink Without Delay": https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Zodra je gaat werken met millis(), gebruik dan altijd unsigned long.
Je mag het huidige tijdstip onthouden voor later: previousMillis = millis()
En je mag het verschil berekenen: if( millis() - previousMillis >= interval)

Dan gaat het namelijk altijd goed. Ook tijdens de rollover van millis().
Deze sketch laat zien hoe dat gaat tijdens de rollover: http://playground.arduino.cc/Code/TimingRollover#arithmetic

Wanneer je gaat proberen om de overflow te bepalen, dan gaat dat een keer mis en je mag geen tijdstip in de toekomst berekenen. Je kunt op die manier niet verder gaan.

Dus elke 15 minuten een aktie. Maar wat bedoel je met een pulse van één cyclus ? Hoe lang wil je dat die pulse altief is ? Is een paar µs okay ?
Dan daar binnen iets gedurende 1 minuut. Dat kan misschien met dezelfde 'previousMillis' en dezelfde 'millis()' als die van 15 minuten, maar ik denk dat er een extra variabele nodig is. Misschien toch een tweede timer met millis(), ik ben er nog niet uit.

Je beschrijving begrijp ik nog niet helemaal, kun je er een schetsje van maken en daar een foto van maken ?

Kun je de "Blink Without Delay" nemen, en dan de 1000ms wijzigen in 15 minuten, en daar de rest bij bouwen ?
Zou je grote getallen 'UL' (unsigned long) willen maken ? Dus 60000UL en 900000UL. Dat vindt de compiler leuker (en ik ook) ;)

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

Re: Timer programma werkt niet.

Berichtdoor Koepel » 19 Apr 2017, 14:27

Een test sketch met een vertraging binnen een cyclus.
Ik ben er niet blij mee. Een state-machine is veel leuker.
Met een state machine is de beschrijving anders: start - doe iets - wacht een minuut - doe iets - wacht 14 minuten - opnieuw

cpp code
// Test met vertraging binnen een software timer
// Een cyclus van 5 seconden,
// en gedurende de eerste seconde daarvan is de led aan.
// Met Arduino IDE 1.8.2 en Arduino Uno.

#define VERTRAAG_MEAS 1000UL
#define TIMER_CYCLUS 5000UL

unsigned long previousMillis;
boolean measActive = false;

void setup()
{
pinMode( LED_BUILTIN, OUTPUT);

// at the end of setup()
previousMillis = millis();
}

void loop()
{
unsigned long currentMillis = millis();

if( currentMillis - previousMillis >= TIMER_CYCLUS)
{
// Aan het einde van deze cyclus, restart the software timer.
previousMillis = currentMillis; // "= currentMillis" or "+= TIMER_CYCLUS"

// Start meting gedurende een minuut voor de nieuwe cyclus.
measActive = true;
digitalWrite( LED_BUILTIN, HIGH);
}
else if( currentMillis - previousMillis >= VERTRAAG_MEAS)
{
// Binnen de cyclus, voorbij het punt van de 1 minuut.
if( measActive)
{
// De minuut van de meting is voorbij
measActive = false;
digitalWrite( LED_BUILTIN, LOW);
}
}
}

Berichten: 3
Geregistreerd: 18 Apr 2017, 08:44

Re: Timer programma werkt niet.

Berichtdoor Pedro71 » 19 Apr 2017, 15:59

Beste Koepel,

Dat is een snelle reactie dank je wel, ik ga zo spoedig mogelijk de code posten.
Dat gaat nu even niet ik ben op mijn werk en zit dit een beetje tussendoor te doen.

Waar het mij in de basis om gaat is dat ik om een xx tijd een meting uit willen voeren en aan de hand van de uitkomst van die meting dan een actie uit wil voeren , in mijn geval dus een pomp en 12 volt valves aan sturen.
volgens mij kan 1 en ander ook met de delay functie maar het lijkt mij beter dat het programma blijft lopen en niet stopt voor een bepaalde tijd voor zover ik het begrijp kunnen er nu dus ook acties naast elkaar lopen terwijl je bij delay op de afloop hiervan wacht.

later als ik dit alles werkend heb wil ik het nog gaan monitoren met python maar dat is voor mij helemaal nieuwe materie dus dat wordt nog een mooie uitdaging, ik ben nu werkzaam in de industriële automatisering en werk hierin behoorlijk veel met PLC's daarin ben ik gewend een programma klein te beginnen en van daaruit steeds verder uitbreiden dus daar ben ik nu met arduino ook maar mee begonnen.

Alvast bedankt het helpt nu al een stuk.

Berichten: 3
Geregistreerd: 18 Apr 2017, 08:44

Re: Timer programma werkt niet.

Berichtdoor Pedro71 » 21 Apr 2017, 10:50

Beste Forumleden,

Ik heb het getest in dit is inderdaad precies wat ik bedoelde, als mijn project klaar is ga ik de volledige code posten.

Dank je wel voor de hulp. :D

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: quvayiveke, xeyefiwef en 8 gasten