CaravanControlCenter
Úvodní stránka › Fórum › Vaše projekty › Arduino › CaravanControlCenter
- Toto téma obsahuje celkem 3 odpovědi. Do diskuze (3 diskutující) se naposledy zapojil uživatel BlindP a poslední změna proběhla před 9 roky a 2 měsíci.
-
AutorPříspěvky
-
21.9.2015 v 23:08 #4634PeterLÚčastník
Zdravim. S Arduinom som zacal cca pred tyzdnom s cielom postavit jednoduche meracie a ovladacie zariadenie pre karavan. Hotove vyrobky su neskutocne drahe a nesplnaju celkom moju predstavu. O co by slo – v karavane mam 12v akumulator, moznost pripojenia 230v, nadrz na vodu, el. bojler, chladnicku atd… Potreboval by som zobrazit stavy, pripadne ovladat niektore zariadenia s dodatocnymi podmienkami (napr. pri prevadzke na 12v sa neda zapnut bojler, po pripojeni 230v zapnut pojde). Dalej by som chcel zobrazit stav vody v nadrzi, teplotu vnutri, vonku, v chladnicke…
Cital som, hladal som a s pomocou existujucich projektov som zostavil nieco, na zaciatok zobrazuje nejake udaje a obrazovky sa prepinaju dokola po stlaceni tlacidla.
Cakanie na tlacidlo by sa dalo vyriesit aj prerusenim a ovladanie urcitych spotrebicov dalsim tlacidlom v konkretnom cykle. Ide mi o to ako vyriesit podsvietenie displaya – mam zapojene na digital pin, potreboval by som aby po urcitom case necinnosti display zhasol a nerusil svetlom hlavne v noci. Pri prevadzke na 12V aj s ohladom na usporu energie.
/* CARAVAN ControlCenter */ #include <LiquidCrystal.h> int stavTlac = 0; int predchStavTlac = 0; int pocitadlo = 1; int pauza = 10; // pocitadlo sposobi aktualizaciu zobrazenia 1x za 10 cyklov - displej neblika int tempPin = 0; //meranie teploty int lightPin = 1; //meranie svetelnosti - len pre ucely programovania zobrazenia - nema vyznam int voltPin = 2; //meranie napatia baterie int ac = 0; //stav pripojenia 230V const int ledPin = 5; //podsvietenie displeja const int switchPin = 6; //tlacidlo prepinania zobrazenia displeja const int acPin = 4; //kontrola pripojenia 230V // nastavenie vstupov LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { // uvodna obrazovka - po zapnuti a resete lcd.begin(16, 2); pinMode(acPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); lcd.setCursor(0, 0); lcd.print("< CARAVAN >"); lcd.setCursor(0, 1); lcd.print(" Control Center "); delay(4000); lcd.clear(); digitalWrite(ledPin, HIGH); delay(500); } void loop() { digitalWrite(ledPin, LOW); while (pocitadlo == 1) { //Zobrazenie teploty int tempReading = analogRead(tempPin); float tempVolts = tempReading * 5.0 / 1024.0; float tempC = (tempVolts - 0.5) * 100.0; // ---------------- if (pauza == 10) { lcd.clear(); lcd.print("Teplota: C"); lcd.setCursor(9, 0); lcd.print(tempC); pauza = 0; } pauza = (pauza + 1); stavTlac = digitalRead(switchPin); if (stavTlac != predchStavTlac) { if (stavTlac == HIGH) { pocitadlo = (pocitadlo + 1); pauza = 10; } } delay(250); while (pocitadlo == 2) { // Zobrazenie svetelnosti int lightReading = analogRead(lightPin); if (pauza == 10) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Svetlo: Lux"); lcd.setCursor(9, 0); lcd.print(lightReading); pauza = 0; } pauza = (pauza + 1); stavTlac = digitalRead(switchPin); if (stavTlac != predchStavTlac) { if (stavTlac == HIGH) { pocitadlo = (pocitadlo + 1); pauza = 10; } } delay(250); } while (pocitadlo == 3) { //Zobrazenie napatia baterie, skusobne meria napajanie displeja - 5V int voltReading = analogRead(voltPin); float volt = voltReading * 10.0 / 1024.0; if (pauza == 10) { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Bateria: V"); lcd.setCursor(9, 0); lcd.print(volt); lcd.setCursor(0, 1); lcd.print ("AC 230V: "); lcd.setCursor(9, 1); int ac = digitalRead(acPin); if (ac == HIGH) { lcd.print ("ANO"); } else lcd.print ("NIE"); pauza = 0; } pauza = (pauza + 1); stavTlac = digitalRead(switchPin); if (stavTlac != predchStavTlac) { if (stavTlac == HIGH) { pocitadlo = (pocitadlo + 1); pauza = 10; } } delay(250); } if (pocitadlo == 4) { pocitadlo = (pocitadlo - 3); } } }
25.9.2015 v 21:02 #4673BlindPÚčastníkAhoj, zkus použít funkci Millis pro časování viz příklad „BlinkWithoutDelay“.
const int ledPin = 13; const int tlac = 7; unsigned long previousMillis = 0; const long interval = 5000; void setup() { pinMode(ledPin, OUTPUT); pinMode(tlac, INPUT); } void loop() { if(digitalRead(tlac) == LOW) { previousMillis = millis(); digitalWrite(ledPin, HIGH); } unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { digitalWrite(ledPin, LOW); } }
Po stisknutí tlačítka sepne led a po 5 vteřinách zhasne.
B.4.10.2015 v 6:18 #4758DanÚčastníkJednou za čas proměnná v millis() přeteče a začíná čítat opět od nuly. Pokud se nemýlím, uvedený příklad s tím vůbec nepočítá a poté by podsvětlení displeje zůstalo svítit až do dalšího stisku klávesy…
4.10.2015 v 18:10 #4767BlindPÚčastníkAno zůstal by svítit pokud by millis přetekl během svícení. Možná pomůže přidat OR millis() < previousMillis.
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.