Close

Prosim o pomoc s termostatom

Úvodní stránka Fórum Vaše projekty Arduino Prosim o pomoc s termostatom

Označeno štítky: ,

  • Toto téma obsahuje celkem 3 odpovědi. Do diskuze (2 diskutující) se naposledy zapojil uživatel dudo a poslední změna proběhla před 7 roky a 7 měsíci.
Aktuálně jsou na stránce zobrazeny 4 příspěvky - 1. až 4. (celkem z 4)
  • Autor
    Příspěvky
  • #7872
    dudo
    Účastník

    Ahojte, prosim o pomoc s termostatom. Nasiel som na nete jeden program, ktory sa mi aj po mensich upravach podarilo rozbehat. Potreboval by som pomoct s upravou programu (kedze moje programatorske vedomosti koncia niekde pri pascale repeat until keypressed) 😀 😀 Tu je program:

    #include <Wire.h>
    #include <OneButton.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LCD.h>
    #include <LiquidCrystal_I2C.h>  // F Malpartida's NewLiquidCrystal library
    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
    #define I2C_ADDR    0x3F  // Define I2C Address where the PCF8574A is
    // States
    #define S_Monitor 0
    #define S_Sleep 1
    #define S_SetTemp 2
    
    int state = S_Sleep; // Initial state
    
    // DS18B20 setup
    #define TempSensor 10 // PIN one wire device (temps sensor) is plugged into
    OneWire oneWire(TempSensor);
    // Pass the OneWire reference to Dallas Temperature sensor
    DallasTemperature sensors(&oneWire);
    
    // OneButton setup
    OneButton button(7, true); // Tell the OneButton library what PIN the button is on
    
    // Initialize the LCD library with the numbers of the interface pins
    
    // Other PINs
    int FridgeRly = 8;
    
    // Vars
    unsigned long Sleep = 0;
    unsigned long SleepLength = 600000; // Dlzka spanku.
    
    float SetTemp = 5.00; // Zakladna teplota
    float TempC = 0;
    float TempF = 0;
    
    bool CoolRun = false;
    bool Boot = true;
    
    void setup() {
      lcd.begin(16, 4); // Set up the LCD's number of rows and columns
      
      sensors.begin(); // Start the DallasTemperature library
      
      // PIN Modes
      pinMode(FridgeRly, OUTPUT);
        
      //Serial.begin(9600); // For testing comment out in production
    }
    
    void loop() {
      switch(state) {
        case S_Monitor:
          F_Monitor();
        break;
        
        case S_Sleep:
          F_Sleep();
        break;
        
        case S_SetTemp:
          F_SetTemp();
        break;
      }
    }
    
    // Functions
    
    void F_Monitor() {
      button.attachPress(F_ButtonPress);
      button.tick();
      
      if (TempC <= SetTemp) {
        lcd.setCursor(0, 1);
        lcd.print("Sledujem...   ");
      }  
      
      F_GetTemp();
      
      F_ShowTemp();
      
      if (TempC > SetTemp) { 
        digitalWrite(FridgeRly, HIGH); // Turn on the compressor
        lcd.setCursor(0, 1);
        lcd.print("Chladim na: "); // "Coolng" is not a spelling error, not enough room on the screen for the "i"
        lcd.print(SetTemp);
        CoolRun = true;
      }
      
      if (CoolRun == true && TempC <= SetTemp) { 
        Sleep = millis();
        state = S_Sleep;
      }
    }
    
    void F_Sleep() { 
      button.attachPress(F_ButtonPress);
      button.tick();
      
      digitalWrite(FridgeRly, LOW); // Shut off the compressor
      lcd.setCursor(0, 1);
      lcd.print("Spim...     ");
    
      F_GetTemp();
     
      F_ShowTemp();
      
      if (millis() - Sleep > SleepLength) {
        CoolRun = false; 
        state = S_Monitor;
      }
    }
    
    void F_SetTemp() {
      button.attachClick(F_Increse);
      button.attachPress(F_ButtonPress2);
      button.tick();
      lcd.setCursor(0, 0);
      lcd.print("Nastav na: ");
      lcd.print(SetTemp);
      lcd.setCursor(0, 1);
      lcd.print("Podrz pre koniec");
    }
    
    void F_Increse() {
      SetTemp = SetTemp + 1.00;
      
      if (SetTemp > 8.00) {
        SetTemp = 2.00;
      }
    }
    
    void F_ButtonPress() {
      state = S_SetTemp;
    }
    
    void F_ButtonPress2() {
      state = S_Monitor;
    }
    
    void F_GetTemp() {
      sensors.requestTemperatures(); // Tell the sensor to record the temp to its memory
      
      TempC = sensors.getTempCByIndex(0); // Retrieve the temp from the sensor's memory and store it in a local var
      
      TempF = (TempC * 9.0)/ 5.0 + 32.0; // Convert to fahrenheit
    }
    
    void F_ShowTemp() {
      lcd.setCursor(0, 0);
      lcd.print("Teplota: "); 
      lcd.print(TempC);
      lcd.print("C    ");
      
      //Serial.print(TempF); Serial.println(" degrees F"); // For testing comment out in production
    }

    A teraz pozoor 😀 😀 – potreboval by som tam este druhy teplotny senzor (aby zobrazoval teplotu v mraziaku – len zobrazoval – riadit sa bude len podla teploty v chladnicke) Miesto jedneho tlacidla by som potreboval 3 (+,- a setup) V setup-e by bolo fajn, keby sa da nastavit teplota pri ktorej sa kompresor zapne (povedzme 5°+x => 5° je nastavena a zapne sa, ked dosiahne 5+x…tak isto aj vypnutie 5°-y. Lepsie povedane mam nastavenu teplotu 5° chcem aby sa kompresor zapol pri 6° a vypol pri 4° (5+1, 5-1). Cas spanku (resp. minimalny cas medzi vypnutim a zapnutim) by sa dal nastavit v rozmedzi od 10 min. do 30 min. Display je 16×4. Samozrejme pridavam fritzing schemu pre lepsie pochopenie.
    A posledna vec Ako sa da pouzit tento senzor http://www.aliexpress.com/item/5a-range-of-single-phase-ac-current-sensor-module-for-arduino-free-shipping-N25/32317969101.html?spm=2114.13010608.0.98.rGqZXl aby mi to zobrazovalo spotrebu za 48hod?

    Attachments:
    #7929
    posjirka
    Účastník

    to není drobná úprava, ale napsat nový program.
    1, pokud chceš MENU, je třeba si zvolit jaké parametry a v jakých hodnotách to budeš ovládat. Proto pak existují knihovny, které to řeší, Případně si musíš napsat menu sám. Pak se to objevuje otázka zda ukládat hodnoty, kam je ukládat a kdy. Pamatuj, že EEPROm mám max 100 000 zápisu, což vypadá usměvně, ale při ukládání každou 1s je to něco přes 1 den, než zničích EEPROM….

    2, někdy je lepší použít potenciometr/trimr na analogovém vstupu spíš, než složitě řešit menu. Stejně to budeš nastavovat 5x za život, tak proč ztrácet čas.
    Dokonce můžeš nastavit i třeba 2 parametry přes 1 AI. Inspirovat se můžeš když si najdeš one wire keypad a místo tlačítka dáš piny + jumper.

    3, přidat další senzor, není problém spíš si třeba v excelu zkus navrhnout jak by to mělo vypadat na LCD. Zapomeň, že bys kombinoval 2 znaky na 1 pozici a máš max. 16 vlastních znaků. Mezi nimi bude „stupeň“. Nakresli si nominální stav a pak 2-3 mezní stavy aby se ti to tam vešlo.

    4, Tlačítko bych dal pouze 1 na přepnutí zobrazení (stiskneš tlačítko a na LCD se ti objeví hodnoty které nastavuješ. Pustíš tlačítko a budeš mít normální zobrazení LCd. …

    #8079
    dudo
    Účastník

    Dakujem za odpoved. Toto je prva verzia (bez zmeny programu). Termostat funguje perfektne. Este sa opytam, ze ako tam doplnim dalsie cidlo?
    P.S. Toto je moj prvy projekt s mikrokontrolerom = uplny amater 🙂

    Attachments:
    #8082
    dudo
    Účastník

    termostat

    Attachments:
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.