arduino met relay control en Timer restart how to do?

hoi

fijn dat er ook een NL gedeelte is.

Hoop dat er arduino mensen zijn die me hier mee zouden kunnen helpen

Gelijk ook mijn eerste post hier op het forum.

Ik heb code geschreven op basis van blinky :stuck_out_tongue:

wat ik doe is dat ik een relay board heb hangen aan de digital pins OUT ( 4 stuks ) en zo kan ik deze HIGH en LOW schakelen

Ik heb een Loop via 5 volt en weerstand naar een digital pin IN welke via een gesloten Loopje HIGH of LOW is.
in die LOOP zitten een aantal meet apparaten die zelf een uitgang breken.
als deze dan word gebroken is de LOOP niet meer aanwezig en dus zal de arduinoe een relay schakelen.

dit werkt

maar wat ik nog wil doen is dat na verloop van tijd hij stopt met schakelen en een 2e relay schakeld wat de betreffende apparaten weer zonder stroom zet en daarmee uitschakeld.

dus de loop loopt bijvoorbeeld 1 uur en na 1 uur word ergens in de loop deze verbroken.
dit mag dan 30 min of zo gebeuren waarna de arduino een andere relay schakeld om de stroom naar deze app. uit te schakelen.

ik weet dat bij basic ( de duinomite mega ) je setimer = 0 doet en dan later IF timer < 30 etc etc

maar hoe doe ik dit met de arduino?

heb wel al zitten zoeken maar als ik wat voorbeelden maar heb er nog niet echt wat uit kunnen vinden.

thx

LG040 welkom op het forum. Kijk eens naar http://arduino.cc/playground/Code/SimpleTimer Daar kan je zo mee aan de slag. Met vriendelijke groet Jantje

Jantje:
LG040
welkom op het forum.
Kijk eens naar http://arduino.cc/playground/Code/SimpleTimer
Daar kan je zo mee aan de slag.
Met vriendelijke groet
Jantje

thx
ben ik al mee aan de slag gegaan maar krijg met de sample code gewoon copy past in de sketch window foutmelding : simpletimer does not name a type

de code die ik gebruik is volgende ( kom dus niks verder )

/*

  • SimpleTimerAlarmExample.pde
  • Based on usage example for Time + TimeAlarm libraries
  • A timer is called every 15 seconds
  • Another timer is called once only after 10 seconds
  • A third timer is called 10 times.

*/

#include <SimpleTimer.h>

// There must be one global SimpleTimer object.
// More SimpleTimer objects can be created and run,
// although there is little point in doing so.
SimpleTimer timer;

// function to be called repeatedly
void RepeatTask() {
Serial.println(“15 second timer”);
}

// function to be called just once
void OnceOnlyTask() {
Serial.println(“This timer only triggers once”);
}

// function to be called exactly 10 times
void TenTimesTask() {
static int k = 0;
k++;
Serial.print(“called “);
Serial.print(k);
Serial.println(” / 10 times.”);
}

// print current arduino “uptime” on the serial port
void DigitalClockDisplay() {
int h,m,s;
s = millis() / 1000;
m = s / 60;
h = s / 3600;
s = s - m * 60;
m = m - h * 60;
Serial.print(h);
printDigits(m);
printDigits(s);
Serial.println();
}

//
// utility function for digital clock display:
// prints preceding colon and leading 0
//
void printDigits(int digits) {
Serial.print(":");
if(digits < 10)
Serial.print(‘0’);
Serial.print(digits);
}

void setup() {
Serial.begin(9600);

// welcome message
Serial.println(“SimpleTimer Example”);
Serial.println(“One timer is triggered every 15 seconds”);
Serial.println(“Another timer is set to trigger only once after 10 seconds”);
Serial.println(“Another timer is set to trigger 10 times”);
Serial.println();

// timed actions setup
timer.setInterval(15000, RepeatTask);
timer.setTimeout(10000, OnceOnlyTask);
timer.setInterval(1000, DigitalClockDisplay);
timer.setTimer(1200, TenTimesTask, 10);
}

void loop() {
// this is where the “polling” occurs
timer.run();
}

Als je een library gebruikt moet je die wel eerst downloaden waar arduino die kan vinden. Lees meer hierover op http://www.arduino.cc/en/Hacking/Libraries vooral se sectie over "User-created libraries" Met vriendelijke groet Jantje

Jantje: Als je een library gebruikt moet je die wel eerst downloaden waar arduino die kan vinden. Lees meer hierover op http://www.arduino.cc/en/Hacking/Libraries vooral se sectie over "User-created libraries" Met vriendelijke groet Jantje

ik heb deze instructies gevolgd dat zou toch goed moeten zijn?

Installation

Create a folder named SimpleTimer in you sketchbook/libraries folder. Copy-n-paste the code for SimpleTimer.h and SimpleTimer.cpp into your favourite text editor, and save those two files under the SimpleTimer folder you just created. Launch or restart the Arduino IDE to let it detect the new library. Copy-n-paste the example code (see below) to get you started with the library.

ben er al

had Simpletimer.cpp staan in plaats van SimpleTimer.cpp pfff hoofdletter gevoelig.

goed hij doet het nu

even zien wat ik er mee aan kan.

hoofdletter gevoelig inderdaad 8) Veel geluk Jantje

is niet echt wat ik zoek of ik begrijp het niet helemaal...

wat ik wil is dat een relay geschakeld word en als een bepaalde tijd over verstreken deze word weer word losgelaten dus wilde een digitale pin gebruiken om de relay te schakelen en dan als er 40min voorbij waren deze pin dan weer uit te zetten..

heb dit allemaal al in mmbasic draaien op een druinomite maar dat even omzetten naar de arduino is me effe wel wat zeg...

zoiets ongeveer?

void setup()
{

unsigned long startime = 0;
unsigned long endtime = 0;
int relaispin = 10;             // relais aan pin 10
int inpin = 9;              // input aan pin 9
}

void loop()
    {
if (inpin =1 ) {                // input hoog
digitalWrite(relaispin, HIGH);         // relais schakelen
startime = millis();            // huidige 'tijd'
endtime = starttime + 2400000;     // gewenste vertragingstij = 40minuten * 60 * 1000
    }
if (millis() >= endtime) {      //tijd verstreken?
digitalWrite(relaispin, LOW);     //relais afschakelen
        }
}

thx ben hier naar aan het kijken maar krijg een inpin is not declared in this scope melding

moet ik hier weer een library voor laden en welke dan?

als ik het goed begrijp weet hij niet wat inpin is maar met de int pin = 9 heb je dat toch gedaan? ergens een typo?

--edit--

zo compiled hij wel zonder errors..

even testen naar board to en dan ledpin13 gebruiken als simulatie relay switch

void setup() {

unsigned long starttime = 0; unsigned long endtime = 0; int relaispin = 10; // relais aan pin 10 int inpin = 9; // input aan pin 9 }

void loop() { unsigned long starttime = 0; unsigned long endtime = 0; int relaispin = 10; // relais aan pin 10 int inpin = 9; if (inpin = 1 ) { // input hoog digitalWrite(relaispin, HIGH); // relais schakelen starttime = millis(); // huidige 'tijd' endtime = starttime + 2400000; // gewenste vertragingstij = 40minuten * 60 * 1000 } if (millis() >= endtime) { //tijd verstreken? digitalWrite(relaispin, LOW); //relais afschakelen } }

had gehoopt met de onderstaande code na 5 sec de onboard led uit te schakelen maar er gebeurd niks

led blijft branden

void setup() {

unsigned long starttime = 0; unsigned long endtime = 0; int relaispin = 13; // relais aan pin 13 onboard led int inpin = 3; // input aan pin 3 pinMode(relaispin, OUTPUT); }

void loop() { unsigned long starttime = 0; unsigned long endtime = 0; int relaispin = 13; // relais aan pin 10 int inpin = 9; if (inpin = 1 ) { // input hoog digitalWrite(relaispin, HIGH); // relais in schakelen } if (inpin = 0 ) { digitalWrite(relaispin, LOW); // relais uit schakelen starttime = millis(); // huidige 'tijd' endtime = starttime + 5000; // gewenste vertragingstij voor test 5 sec = 40minuten * 60 * 1000 } if (millis() >= endtime) { //tijd verstreken? digitalWrite(relaispin, LOW); //relais afschakelen } }

ok heeft even wat uurtjes experimenteren gekost maar het werkt in basis nu.

nu nog alleen de code aanpassen voor de verschillende relays uitgangen en ik ben up and running

hier is de code tot nu toe

wat ik vreemd vind is als ik delay(500) ( of andere hogere waarde ) niet erin zet dan werkt het niet , zet ik hem wel erin dan na ~10 sec blijft de led uit ongeacht de input status.


/*
Button

Turns on and off a light emitting diode(LED) connected to digital
pin 13, when pressing a pushbutton attached to pin 2.

The circuit:

  • LED attached from pin 13 to ground

  • pushbutton attached to pin 2 from +5V

  • 10K resistor attached to pin 2 from ground

  • Note: on most Arduinos there is already an LED on the board
    attached to pin 13.

created 2005
by DojoDave http://www.0j0.org
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

*/

// constants won’t change. They’re used here to
// set pin numbers:
const int buttonPin = 3; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
const int ledPin2 = 14; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}

void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
unsigned long starttime = 0;
unsigned long endtime = 0;
starttime = millis(); // huidige ‘tijd’
endtime = 10000; // gewenste vertragingstij voor test 5 sec = 40minuten * 60 * 1000

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (millis() > endtime) { //tijd verstreken?
digitalWrite(ledPin, LOW); //relais afschakelen
delay(500);
}
else {
// turn LED off:
digitalWrite(ledPin2, LOW);
}
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}

LG046: ok heeft even wat uurtjes experimenteren gekost maar het werkt in basis nu.

nu nog alleen de code aanpassen voor de verschillende relays uitgangen en ik ben up and running

hier is de code tot nu toe

wat ik vreemd vind is als ik delay(500) ( of andere hogere waarde ) niet erin zet dan werkt het niet , zet ik hem wel erin dan na ~10 sec blijft de led uit ongeacht de input status.

- unsigned long starttime = 0; unsigned long endtime = 0; starttime = millis(); // huidige 'tijd' endtime = 10000; // gewenste vertragingstij voor test 5 sec = 40minuten * 60 * 1000

// check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (millis() > endtime) { //tijd verstreken? digitalWrite(ledPin, LOW); //relais afschakelen delay(500); }

millis() is een altijd optellende waarde welke aangeeft hoelang het huidige programma aan het lopen is. Deze waarde loopt over na 4294967296 ms (+/- 50 dagen. Je moet daarom je eindtijd bepalen door de huidige waarde van millis() te nemen en daar de gewenste vertraging bij op te tellen. In Uw code zal het 1x werken, nl. na 10 seconden. Daarna is millis() 10000 voorbij en zal het een dag of 50 later, als millis voorbij 4294967295 gaat en terug op 0 komt, nog eens werken...

dit is versie 1.1 met aanpassing zoals jij voorsteld wat vind je hier van?

//This example code is in the public domain.

// constants won't change. They're used here to // set pin numbers: const int buttonPin = 3; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin const int ledPin2 = 14; // the number of the LED pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status

void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); }

void loop(){ // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); digitalWrite(ledPin, HIGH); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (buttonState == LOW) { // turn LED on: balance() ; } else { // turn LED off: loop() ; }

}

void balance() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); unsigned long starttime = 0; unsigned long endtime = 0; starttime = millis(); // set current time of system endtime = starttime + 5000; // timer in miliseconds test set to 5 seconden

// check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (millis() > endtime) { //over time digitalWrite(ledPin, LOW); //relais off delay(500); } else { // turn LED off: digitalWrite(ledPin2, LOW); } if (buttonState == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } }

ben nog even terug gegaan naar jou code

ik kreeg daarbij een foutmelding iets met scope.

heb deze nu zonder compile errors maar als ik hem dan upload naar het board schakeld led13 de onboard led niet uit na 5 sec

--

void setup() {

unsigned long startime = 0; unsigned long endtime = 0; int relaispin = 13; // relais aan pin 10 int inpin = 3; // input aan pin 9 }

void loop() { unsigned long starttime = 0; unsigned long endtime = 0; int relaispin = 13; int inpin = 3; pinMode(relaispin, OUTPUT); pinMode(inpin, INPUT); if (inpin = 1 ) { // input hoog digitalWrite(relaispin, HIGH); // relais schakelen starttime = millis(); // huidige 'tijd' endtime = starttime + 5000; // gewenste vertragingstij = 40minuten * 60 * 1000 } if (millis() >= endtime) { //tijd verstreken? digitalWrite(relaispin, LOW); //relais afschakelen } }

LG046:
ben nog even terug gegaan naar jou code

ik kreeg daarbij een foutmelding
iets met scope.

heb deze nu zonder compile errors maar als ik hem dan upload naar het board schakeld led13 de onboard led niet uit na 5 sec

void setup()

{

unsigned long startime = 0;
unsigned long endtime = 0;
int relaispin = 13; // relais aan pin 10
int inpin = 3; // input aan pin 9
}

void loop()
{
  unsigned long starttime = 0;
unsigned long endtime = 0;
  int relaispin = 13;
  int inpin = 3;
  pinMode(relaispin, OUTPUT);
  pinMode(inpin, INPUT);
if (inpin = 1 ) { // input hoog
digitalWrite(relaispin, HIGH);         // relais schakelen
starttime = millis(); // huidige ‘tijd’
endtime = starttime + 5000;     // gewenste vertragingstij = 40minuten * 60 * 1000
}
if (millis() >= endtime) { //tijd verstreken?
digitalWrite(relaispin, LOW);    //relais afschakelen
}
}

Je declareerd 2 keer hetzelfde. In setup zeg je dat star**time en endtime unsigned long zijn met een waarde ‘0’
Dan doe je hetzelfde nog eens in de ‘main’ loop.(maar deze keer star
tt**ime)
Dat betekend dus wel dat wanneer de loop terug begint (dus na " if (millis() >= endtime)… etc " deze 2 waardes terug op nul gezet worden.

BTW: probeer eens de code-knop # als je code post. Makkelijker om te lezen.!(http://|Insert Code)

starttime of startime was een type fout uit jou code neem ik aan? moet neem ik aan starTTime zijn met 2 t's.

wat ik wilde doen is de teller opnieuw naar 0 zetten eigenlijk.. als ik namelijk starttime + 5000 ( voorbeeld 5sec ) doet hij bij mij niks bij blijft gewoon doorlopen en stopt niet na 5 sec.. als ik de starttime dus weg haal stopt hij bij mij na 5000 sec.

nou

nog steeds geen succes

heb de timer de time en timealarm als gebrobeert

waarom kan die arduino niet gewoon zoals de duinomite een functie settimer = 0 doen en dan later if timer > 20000 DO something.... alles zo onnodig complex...

ik heb een gesloten verbinding tussen ground en pin2 deze word extern gebroken bijvoorbeeld dmv een druk knop of iets anders.

zolang die pin2 niet veranderd mag pin 3 HIGH zijn.

op het moment dat die pin2 veranderd moet pin3 low worden en zodra pin2 weer veranderd moet pin3 weer HIGH worden en zo om en om.

op het moment dat voor het eerste pin2 veranderd moet een timer gaan lopen van 40 min waarbij na 40 min het programme stop. dus zeg maar gaan naar END() waar een oneindige loop in zit.

pas las de arduino word gereset of power cylce begint het weer van voor af aan.

moet toch mogelijk zijn of niet?

edit

als ik nou de Alarm.timerOnce binnen in een loop(){ zou kunnen zetten zou het kunnen werken maar dat heb ik al probeert.. dan werkt het niet er gebeurd helemaal niks.

heb binnnen de loop staan Alarm.timerOnce(1, END);

maar na 10sec gebeurd er niks hij gaat niet naar void END toe.

Dit lijkt me toch niet zo moeilijk.
Onderstaand niet geteste code als een voorzet.
Het is een combinatie van de code die je hier kan vinden http://arduino.cc/en/Reference/AttachInterrupt
en een timer conditie
met vriendelijke groet
Jantje

int pin = 3;
volatile int state = HIGH;
int prefState = state;
unsigned long TimerStart=0;

void blink()
{
  state = !state;
}

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
	if(prefState != state ) // de knop is vernderd
	{
		prefState = !prefState; //Zet prefState gelijk aan state
		if (TimerStart==0) //is dit de eerste keer dat de schakelaar van stand veranderd?
		{
			TimerStart=millis(); //Zo ja start de timer
		}
  digitalWrite(pin, prefState); //zet de pin goed
	}
	if ( (TimerStart!=0) && ((TimerStart+40*60*100) < millis()) ) // de timer is meer dan 40 minuten geleden gestart
	{
		while(true);//wacht voor eeuwig en altijd
	}
}

het is natuurlijk niet af zoals je zegt een voorzet maar ik heb er mee zitten spelen en het werkt bijna

( ik heb de pin13 onboard led gebruiks als idicator dus pin3 naar pin13 gezet )

hij doet het soms wel en soms niet.

de ene keer als ik een gesloten loop heb ( dus pin 2 van de interupt 0 ) niet gebroken dan gaat led13 uit maar na een paar keer verbinding maken en breken is het ineens andersom.. bij het breken gaat de led juist aan en bij maken van verbinding uit...?

ik heb eeb weerstand erbij gezet maar maakt niks uit kan ik de internal pullup niet gebruiken? ( heb het ook al gebrobeerd no effect maar vraag het toch even. )

het werkt leuk als hij maar 1 x hoeft te veranderen en dan 40 min in dei staat moet staan vooraleer hij er helemaal mee stopt maar gedurende die 40min zal de interupt keer op keer en een flink aantal keren achtererlkaa steeds worden getriggerd. ik dacht al een debounce toe te voegen? delay(100) ( heb maar wat meer gepakt? ) maar ook geen effect