Close

Ovládání bazénového čerpadla

Úvodní stránka Fórum Vaše projekty Arduino Ovládání bazénového čerpadla

Aktuálně jsou na stránce zobrazeny 3 příspěvky - 1. až 3. (celkem z 3)
  • Autor
    Příspěvky
  • #7856
    Lofasuj
    Účastník

    Zdravím potřebuji poradit. Udělal jsem si ovládání bazénového čerpadla spínání pomocí relé v závislosti na teplotě. Program je v celku funkční akorát mám problém se zobrazením teploty na na lcd displeji na sériovém monitoru teplota funguje ovšem lcd display mi jen slabě problikává. Děkuji za rady a za tipy na možnost rozšíření.

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <OneWire.h>
    int DS18S20_Pin = 3; //čidlo je připojeno na pinu 3
    // vytvoří objekt lcd a nastaví jeho adresu
    // 0x20 a 16 zanků na 2 řádcích
    // zapojení displeje SCL-28-A5,SDA-27-A4
    LiquidCrystal_I2C lcd(0x27,16,2);

    OneWire ds(DS18S20_Pin);

    void setup(void) {
    Serial.begin(9600);
    pinMode(5, OUTPUT); // rele 1
    pinMode(6, OUTPUT); // rele 2 (využijeme bez relé pro lepší a snažší orientaci (relé Č. 2 ponecháme volné pro možnost připojení budoucích zařízení (PROGRAM PRO OBSLUHU SMAZÁN!)
    lcd.init();// inicializuje displej
    lcd.backlight(); // zapne podsvětlení displeje
    }

    void loop(void) {
    lcd.init();// inicializuje displej
    lcd.backlight(); // zapne podsvětlení displeje
    float temperature = getTemp();
    int nastavenateplota = 43; // zde nastavujeme teplotu při které budeme spínat relé čerpadla
    Serial.println(temperature);
    char teplota = temperature;

    lcd.print(„Aktualni teplota:“);
    lcd.print(teplota);
    lcd.print(„°C“);
    lcd.setCursor(0,1);
    lcd.print(„Teplota spinani: „);
    lcd.print(nastavenateplota);
    if (temperature >= nastavenateplota) { // zde pdmínka pro teplotu při které se má sepnout relé (nastavujeme teplotu)
    digitalWrite(5, HIGH); // sepneme
    } else if (temperature < nastavenateplota) {
    digitalWrite(5, LOW); // rozepneme
    }

    delay(100); //pomalejší zobrazování teplot pro lepší čitelnost

    }
    float getTemp(){
    byte data[12];
    byte addr[8];
    if ( !ds.search(addr)) {
    ds.reset_search();
    return -1000;
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println(„CRC is not valid!“);
    return -1000;
    }
    if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print(„Device is not recognized“);
    return -1000;
    }
    ds.reset();
    ds.select(addr);
    ds.write(0x44,1);
    byte present = ds.reset();
    ds.select(addr);
    ds.write(0xBE);
    for (int i = 0; i < 9; i++) { // potřebujeme 9 bytů
    data[i] = ds.read();
    }
    ds.reset_search();
    byte MSB = data[1];
    byte LSB = data[0];
    float tempRead = ((MSB << 8) | LSB);
    float TemperatureSum = tempRead / 16;
    return TemperatureSum;
    }

    #7858
    Aleš
    Účastník

    Zkuste jinou knihovnu pro LCD:
    NewliquidCrystal_1.3.4.zip (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads)

    #7862
    posjirka
    Účastník

    podle mě je problém ve 2 stupních:
    1. proč znovu v každé smyčce LOOP inicializuješ LCD? – za mě vypustit stačí v SETUP
    2. Na co potřebujeě refresh 100ms myslím si že 1 – 5s jsou úplně v pořádku, takže ten delay(100); změň na delay(2000);

    add.1. při inicializaci se ti smaže celý text na LCD zbytečný rušivý element
    add.2. 100ms = 10 Hz obnovovací frekvence + doba měření teploty to oko ztěží zareaguje

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