Close

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.
Aktuálně jsou na stránce zobrazeny 4 příspěvky - 1. až 4. (celkem z 4)
  • Autor
    Příspěvky
  • #4634
    PeterL
    Úč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);
        }
    
      }
    }
    
    #4673
    BlindP
    Účastník

    Ahoj, 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.

    #4758
    Dan
    Účastník

    Jednou 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…

    #4767
    BlindP
    Účastník

    Ano zůstal by svítit pokud by millis přetekl během svícení. Možná pomůže přidat OR millis() < previousMillis.

Aktuálně jsou na stránce zobrazeny 4 příspěvky - 1. až 4. (celkem z 4)
  • Pro reakci na toto téma se musíte přihlásit.