» »

Arduino kot časovni rele

Arduino kot časovni rele

davor92 ::

Pozdravljeni,

Sem začetnik pri uporabi razvojne plošče arduino in mi ga rad uporabil kot časovni rele.
Ko bi pritisnil gumb (npr. pin 2) bi se začel odštevati nastavljen čas. Po preteku tega časa bi se postavil izhod (npr. pin 12) na stanje 1.

Omenjen program bi namreč uporabil za krmiljenje garažnih vrat in bi se tako npr. pol ure po odprtju sama nazaj zaprla.


Prosim za pomoč

Fuks ::

Nisi postavil vprašanja, kje imaš težave?

Na prvo žogo izgleda kot precej preprosto.

V zanki loop() bereš vrednost gumba, ko zaznaš spremembo sprožiš delay. Ko se ta izteče pa postaviš vrednost izhoda.

Nekaj ostalih stvari v premislek:
- ali se vrata sama nehajo "zapirati" ko so že do konca zaprta? Ali bi moral signal za zapiranje po nekaj časa izklopiti?

davor92 ::

To bo samo dodatek poleg klasičnega Hormanovega pogona za garažna vrata. Zgodi se, da večkrat po pomoti ostanejo odprta, s tem pa bi nastavil časovnik, ki bi npr. pol ure po odprtju dal signal za zapiranje (kratek pulz).

Če je možno bi prosil za vzorec programa, ki pomoje obsega samo par vrstic.



Hvala in lp

Zgodovina sprememb…

  • spremenilo: davor92 ()

Fuks ::

Skombiniraj vse tri example sam, res ni rocket science in vsaka vrstica ima komentar :)

https://www.arduino.cc/en/Reference/Del...
https://www.arduino.cc/en/Reference/Dig...
https://www.arduino.cc/en/tutorial/push...

davor92 ::

Uspelo mi je narediti program, ki deluje, vendar imam en problem.
Časovnik aktivira ob vklopu končnega stikala in začne s štetjem časa, vendar se ob sprostitvi končnega stikala ne ustavi ampak šteje naprej. Jaz bi rad, da se ob sprostitvi končnega stikala časovnik resetira in čaka na ponovno aktivacijo.

Zgodi se mi namreč, da v primeru, če znotraj časa, ki je nastavljen na časovniku jaz ročno zaprem vrata potem po nastavljenem času pošlje pulz na motor in mi jih odpre.

Pomoje bi potreboval samo nek ukaz, ki bi vedno ob sprostitvi stikala resetiral časovnik. Prosim za pomoč.

Še moj trenutni program:

//Global Variables
const byte BUTTON=2; // our button pin
const byte LED=12; // LED


unsigned long buttonPushedMillis; // when button was released
unsigned long ledTurnedOnAt; // when led was turned on
unsigned long turnOnDelay = 2500; // wait to turn on LED
unsigned long turnOffDelay = 3600000; // turn off LED after this time
bool ledReady = false; // flag for when button is let go
bool ledState = false; // for LED is on or not.

void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
}

void loop() {
// get the time at the start of this loop()
unsigned long currentMillis = millis();

// check the button
if (digitalRead(BUTTON) == LOW) {
// update the time when button was pushed
buttonPushedMillis = currentMillis;
ledReady = true;
}

// make sure this code isn't checked until after button has been let go
if (ledReady) {
//this is typical millis code here:
if ((unsigned long)(currentMillis - buttonPushedMillis) >= turnOnDelay) {
// okay, enough time has passed since the button was let go.
digitalWrite(LED, HIGH);
// setup our next "state"
ledState = true;
// save when the LED turned on
ledTurnedOnAt = currentMillis;
// wait for next button press
ledReady = false;
}
}

// see if we are watching for the time to turn off LED
if (ledState) {
// okay, led on, check for now long
if ((unsigned long)(currentMillis - ledTurnedOnAt) >= turnOffDelay) {
ledState = false;
digitalWrite(LED, LOW);
delay(4000); // waits for four second
digitalWrite(LED, HIGH); // sets the LED on

}
}
}

Fuks ::

Prosim malo še razloži:

V tvojem programu imaš gumb in LED diodo. Če prav razumem je gumb fizični gumb, ki ga pritisneš ko želiš aktivirati sistem da po pretečenem času zapre vrata? LED dioda je pa v resnici izhod iz sistema, ki pravzaprav ni LED dioda ampak so garažna vrata? Zakaj nisi drugače poimenoval tega, bi bilo malce lažje za brat.

Zgodi se mi namreč, da v primeru, če znotraj časa, ki je nastavljen na časovniku jaz ročno zaprem vrata potem po nastavljenem času pošlje pulz na motor in mi jih odpre.


Hmm... se mi zdi, kot da ni to problem timerja. Kako pa naj bi sistem vedel da si ti ročno zaprl vrata? Tega vhodnega podatka nimaš. Imaš pa dve možnosti:

1. Če ročno zapreš vrata, potem npr gumb pritisneš šeenkrat da sistem deaktiviraš. Ali si to imel v mislih?

2. Tako odpiranje kot zapiranje vrat opraviš preko arduinota, tovarniško stikalo pa ne uporabljaš več. Na ta način imaš v arduinotu vedno podatek o tem ali so vrata odprta ali zaprta (s tem tudi odpreš dodatne možnosti za kakšne pametne razširitve sistema ;) ).

Če hočeš prvo varianto je to to. Malo sem preimenoval spremenljivke da sem sploh razumel vse skupaj:

//Global Variables
const byte BUTTON = 2; // our button pin
const byte LED = 12; // LED 


unsigned long buttonPushedTime; // when button was pushed
unsigned long doorOpenedTime; // when led was turned on
unsigned long buttonActivationDelay = 2500; // wait to turn on LED
unsigned long doorAutoCloseTimeout = 3600000; // turn off LED after this time
bool buttonPressed = false; // flag for when button is let go
bool systemArmed = false; // for LED is on or not.

void setup() {
	pinMode(BUTTON, INPUT_PULLUP);
	pinMode(LED, OUTPUT);
	digitalWrite(LED, HIGH);
}

void loop() {
	// get the time at the start of this loop()
	unsigned long currentTime = millis();

	// check the button
	if (digitalRead(BUTTON) == LOW) {
		// update the time when button was pushed
		buttonPushedTime = currentTime;
		buttonPressed = true;
	}

	// make sure this code isn't checked until after button has been let go
	if (buttonPressed) {
		//this is typical millis code here:
		if ((unsigned long)(currentTime - buttonPushedTime) >= buttonActivationDelay) {
			if (systemArmed) {
				digitalWrite(LED, LOW);
				// setup our next "state"
				systemArmed = false;
			}
			else {
				// okay, enough time has passed since the button was let go.
				digitalWrite(LED, HIGH);
				// setup our next "state"
				systemArmed = true;
				// save when the LED turned on
				doorOpenedTime = currentTime;				
			}

			// wait for next button press
			buttonPressed = false;
			
		}
	}

	// see if we are watching for the time to turn off LED
	if (systemArmed) {
		// okay, led on, check for how long
		if ((unsigned long)(currentTime - doorOpenedTime) >= doorAutoCloseTimeout) {
			systemArmed = false;
			digitalWrite(LED, LOW);
			delay(4000); // waits for four second 
			digitalWrite(LED, HIGH); // sets the LED on

		}
	}
}

davor92 ::

V bistvu je tako, da je ta sistem, ki bazira na arduinotu čisto neodvisen od tovarniške kontrole Hormanovih vrat, ker nisem hotel preveč posegati v sam motor in kontrolo, ker je še v garanciji. Izhod releja iz arduinota je samo vzporedno vezan s tovarniško tipko.
Spremenljivk nisem preimenoval, ker sem predelal en program, ki sem ga našel na spletu...Gumb je v bistvu končno stikalo za pozicijo "odprto", da začne časovnik odštevati, LED dioda pa je v bistvu rele.


Kolikor jaz vidim, je problem samo v tem, da začne časovnik odštevati ob prvi aktivaciji končnega stikala in ob morebitnem ročnem zapiranju znotraj nastavljenega časa še vedno odšteva. Ker so vrata zaprta ob ročnem zapiraju zaprta jih nato pulz na releju po eni uri odpre namesto da bi miroval.

Jaz bi rad, da se ob umaknitvi vrat od končnega stikala časovnik resetira in čaka na novo aktivacijo. Upam, da je sedaj bolj jasno kaj imam v mislih.


Željena stvar mi s pametnim relejem Siemens Logo ali Schenider Zelio deluje brez problemov, ampak se mi zdi malce predraga rešitev, zato bi rad tu uporabil arduinota.

Zgodovina sprememb…

  • spremenilo: davor92 ()

Fuks ::

Kolikor jaz vidim, je problem samo v tem, da začne časovnik odštevati ob prvi aktivaciji končnega stikala in ob morebitnem ročnem zapiranju znotraj nastavljenega časa še vedno odšteva.


Ja seveda, Arduino _ne ve_ da si ti vrata ročno zaprl. Beri zgornji dve opciji iz prejšnjega posta... ali najdi en indikator stanja zaprtosti vrat (en signal npr...) ki ga boš lahko uporabil. Arduino nima čarobne krogle.

davor92 ::

Sem uredil, Hvala za informacije, je bilo kar dosti uporabnega iz zgornjih postov.

Zgodovina sprememb…

  • spremenilo: davor92 ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Merjenje prevodnosti vode?

Oddelek: Elektrotehnika in elektronika
192757 (1912) Ribič
»

Pomoč C++

Oddelek: Pomoč in nasveti
71263 (982) samo111
»

Arduino in luči (strani: 1 2 )

Oddelek: Elektrotehnika in elektronika
9811381 (9007) FX6300B
»

Arduino "leteče luči"

Oddelek: Elektrotehnika in elektronika
132876 (1753) zrataj4201
»

Arduino frekvenca

Oddelek: Elektrotehnika in elektronika
71070 (876) borisk

Več podobnih tem