Close

RHT 03 – měření teploty a vlhkosti vzduchu

Úvodní stránka Fórum Hardware Senzory RHT 03 – měření teploty a vlhkosti vzduchu

Označeno štítky: , ,

  • Toto téma obsahuje celkem 15 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel tivvit a poslední změna proběhla před 9 roky a 4 měsíci.
Aktuálně je na stránce zobrazeno 16 příspěvků - 1. až 16. (celkem z 16)
  • Autor
    Příspěvky
  • #2644
    tom.vitek
    Účastník

    Dobrý den,
    postupoval sme podle tohoto zapojení : při nahrávání programu do Arduina mega 2560 se mi ukáže tato chyba: dht_test.ino:11:17: fatal error: dht.h: No such file or directory
    compilation terminated.
    Chyba kompilace.

    Myslím si že to bude nějaká prkotina ale nemůžu na to přijít. Díky za každou radu. Tom V.

    #2645
    tom.vitek
    Účastník
    #2647
    Zbyšek Voda
    Účastník

    Dobrý den,

    myslím, že to bude tím že nemáte staženou, nebo správně přidanou knihovnu. V návodu máte odkaz přímo v prvním odstavci. Kdyžtak návod, jak přidat knihovnu najdete zde: https://bastlirna.hwkitchen.cz/jak-importovat-knihovnu-do-arduino-ide/:)

    #2649
    tom.vitek
    Účastník

    jo, měl jste pravdu bylo to knihovnou. Díky moc už to měří jak má 🙂

    #2650
    tom.vitek
    Účastník

    ještě dotaz: co kdybych tyto čidla měl 2 a chtěl bych jejich hodnoty průměrovat… máte s tím zkušenosti ?

    #2651
    Zbyšek Voda
    Účastník

    Tomu se věnují třeba tady: http://diy-scib.org/blog/multiple-dht-humidity-sensors-arduino
    Sám jsem to ale ještě nezkoušel.

    #2699
    tom.vitek
    Účastník

    Ahoj, ještě bych tu měl jeden problém :

    chci pomocí teploty ovládávat relé na který je napojen větrák

    když je teplota => 25°C tak sepni větrák (relé)
    když je teplota =< 20°C tak vypni větrák (relé)

    program:
    if (dht1.readTemperature => „25.0“)
    {
    digitalWrite(relePin1, LOW);
    if (dht1.readTemperature =< „20.0“)
    {
    digitalWrite(relePin1, HIGH);
    }
    }

    napsal sem to nějak takhle, ale program mi nebere ty hodnoty
    chyba říka:
    celek_pokus_vetrak.ino: In function ‚void loop()‘:
    celek_pokus_vetrak.ino:53:28: error: expected primary-expression before ‚>‘ token
    celek_pokus_vetrak.ino:56:30: error: expected primary-expression before ‚<‚ token
    Chyba kompilace.

    program je vytržen z celého programu zde:
    //Projekt Inteligentní skleník Vítek Tomáš
    #include <DHT.h> // knihovna dht teploty
    #define DHT1PIN 7 //teplota
    #define DHT2PIN 6 // teplota 2
    #define DHT1TYPE DHT22 //definuje typ senzoru
    #define DHT2TYPE DHT22 //definuje typ senzoru
    DHT dht1(DHT1PIN, DHT1TYPE); //definuje typ senzoru
    DHT dht2(DHT2PIN, DHT2TYPE); //definuje typ senzoru
    int temt6000Pin = A0; // senzor svetla
    int dirpin = 8; // motorek dir
    int steppin = 9; // motorek step

    byte sensorInterrupt = 0; // 0 = digital pin 2 //zacatek prutokomer
    byte sensorPin = 2;
    float calibrationFactor = 4.5;
    volatile byte pulseCount;
    float flowRate;
    unsigned int flowMilliLitres;
    unsigned long totalMilliLitres;
    unsigned long oldTime; // konec prutokomer
    //———————-POKUS ovladani vetraku —————————–
    const int buttonPin1 = 50; // kam je připojeno tlačítko
    const int relePin1 = 30; // kam je připojeno rele
    int buttonState = 0;
    //————————————————————–
    void setup() {
    Serial.begin(9600);
    pinMode(relePin1, OUTPUT); // POKUS rele jako vystup na pin
    pinMode(buttonPin1,INPUT); //POKUS tlačítka jako vstup:
    pinMode(dirpin, OUTPUT); // motorek
    pinMode(steppin, OUTPUT); // motorek
    pinMode(sensorPin, INPUT); //zacatek prutokomer
    digitalWrite(sensorPin, HIGH);

    pulseCount = 0;
    flowRate = 0.0;
    flowMilliLitres = 0;
    totalMilliLitres = 0;
    oldTime = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // konec prutokomer
    dht1.begin(); // zacni merit teplotu 1
    dht2.begin(); // zacni merit teplotu 2
    }

    void loop() {
    //ovládání relé 1 pomocí tlačítka —————–
    void vetrak1();
    buttonState = digitalRead(buttonPin1);
    if (buttonState == HIGH) { // zapneme relé:
    digitalWrite(relePin1, LOW);
    }else {
    digitalWrite(relePin1, HIGH); } // vypneme rele
    //ovládání větráku pomocí teploty POKUS ————–
    if (dht1.readTemperature => „25.0“)
    {
    digitalWrite(relePin1, LOW);
    if (dht1.readTemperature =< „20.0“)
    {
    digitalWrite(relePin1, HIGH);
    }
    }

    //——————–prutokomer——————————————–
    if((millis() – oldTime) > 1000) // Only process counters once per second
    {
    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() – oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    unsigned int frac;
    pulseCount = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
    }
    //———————-lcd——————————-
    clearLCD();
    backlightOn();
    unsigned int frac; // deklarace promere frac pro prutokomer
    //————————————————
    selectLineOne();
    delay(100);
    Serial.print(„T1:“);
    Serial.print(dht1.readTemperature(),1);
    Serial.print((char)223); // vypíše znak ° na displej
    Serial.print(„C „);
    Serial.print(„T2:“);
    Serial.print(dht2.readTemperature(),1);
    Serial.print((char)223); // vypíše znak ° na displej
    Serial.print(„C“);
    delay(500);
    //————————————————
    selectLineTwo();
    delay(100);
    Serial.print(„Vl:“);
    Serial.print(dht1.readHumidity(),1);
    Serial.print(„% „);
    Serial.print(„V2:“);
    Serial.print(dht2.readHumidity(),1);
    Serial.print(„%“);
    delay(500);
    //————————————————
    selectLineThree();
    delay(100);
    Serial.print(„VP:“);
    Serial.print(analogRead(A1)/11,1);
    Serial.print(„% „);
    Serial.print(„S:“);
    Serial.print(analogRead(temt6000Pin)/11,1);
    Serial.print(„%“);
    delay(500);
    //———————————————
    selectLineFour();
    delay(100);
    Serial.print(„P:“);
    Serial.print(int(flowRate)); // Print the integer part of the variable
    Serial.print(„.“); // Print the decimal point
    frac = (flowRate – int(flowRate)) * 10;
    Serial.print(frac, DEC) ; // Print the fractional part of the variable
    Serial.print(„L/min“);
    Serial.print(„Pc“); // Output separator
    Serial.print(totalMilliLitres);
    Serial.println(„mL“);
    delay(5000);
    //——————————————–
    }
    //SerialLCD Functions
    void selectLineOne(){ //puts the cursor at line 0 char 0.
    Serial.write(0xFE); //command flag
    Serial.write(128); //position
    }
    void selectLineTwo(){ //puts the cursor at line 2 char 0.
    Serial.write(0xFE); //command flag
    Serial.write(192); //position
    }
    void selectLineThree(){ //puts the cursor at line 3 char 0.
    Serial.write(0xFE); //command flag
    Serial.write(148); //position
    }
    void selectLineFour(){ //puts the cursor at line 4 char 0.
    Serial.write(0xFE); //command flag
    Serial.write(212); //position
    }
    void goTo(int position) { //position = line 1: 0-19, line 2: 20-39, etc, 79+ defaults back to 0
    if (position<20){ Serial.write(0xFE); //command flag
    Serial.write((position+128)); //position
    }else if (position<40){Serial.write(0xFE); //command flag
    Serial.write((position+128+64-20)); //position
    }else if (position<60){Serial.write(0xFE); //command flag
    Serial.write((position+128+20-40)); //position
    }else if (position<80){Serial.write(0xFE); //command flag
    Serial.write((position+128+84-60)); //position
    } else { goTo(0); }
    }
    void clearLCD(){
    Serial.write(0xFE); //command flag
    Serial.write(0x01); //clear command.
    }
    void backlightOn(){ //turns on the backlight
    Serial.write(0x7C); //command flag for backlight stuff
    Serial.write(157); //light level.
    }
    void backlightOff(){ //turns off the backlight
    Serial.write(0x7C); //command flag for backlight stuff
    Serial.write(128); //light level for off.
    }
    void backlight50(){ //sets the backlight at 50% brightness
    Serial.write(0x7C); //command flag for backlight stuff
    Serial.write(143); //light level for off.
    }
    void serCommand(){ //a general function to call the command flag for issuing all other commands
    Serial.write(0xFE);
    }
    //————–motorek1————————–
    void motor1(){
    int i;
    digitalWrite(dirpin, LOW); // Nastaveni smeru
    delay(100);
    for (i = 0; i<4000; i++) // otočení o 4000 kroků
    {
    digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the
    digitalWrite(steppin, HIGH); // „Rising Edge“ so the easydriver knows to when to step.
    delayMicroseconds(500); // rychlost otáček
    }
    digitalWrite(dirpin, HIGH); // Nastaveni smeru
    delay(10000);
    for (i = 0; i<4000; i++) // otočení o 4000 kroků
    {
    digitalWrite(steppin, LOW); // This LOW to HIGH change is what creates the
    digitalWrite(steppin, HIGH); // „Rising Edge“ so the easydriver knows to when to step.
    delayMicroseconds(500); // This delay time is close to top speed for this
    }
    }
    // particular motor. Any faster the motor stalls.
    //————motorek2——————————–
    //————motorek3———————————
    //————vetrak1——————————-
    //————-vetrak2——————————-
    //———————topeni———————-
    //——————–LED-paska——————–
    // —————-senzor-světla——————-
    void svetlo(){
    int value = analogRead(temt6000Pin);
    }
    //—————vlhkost-půdy————————–
    void vlhkostpudy(){
    int sensorValue = analogRead(A1);
    }
    //———teplota 1,2 — vlhkost 1,2 —————–
    void teplotavlhkost(){
    delay(4000);
    float h1 = dht1.readHumidity();
    float t1 = dht1.readTemperature();
    float h2 = dht2.readHumidity();
    float t2 = dht2.readTemperature();
    if (isnan(t1) || isnan(h1)) {
    Serial.println(„Failed to read from DHT #1“);
    }
    if (isnan(t2) || isnan(h2)) {
    Serial.println(„Failed to read from DHT #2“);
    }
    }
    //————-prutokomer——————–
    void pulseCounter()
    {
    pulseCount++;
    }

    Díky

    #2700
    Zbyšek Voda
    Účastník

    Nebude chyba v tom, ze cisla zabalujete do uvozovek? On je pak program bere jako String a ne jako cislo 😉

    #2701
    tom.vitek
    Účastník

    aha, díky na radu ale i když jsem se smazal tak program píše tuhle chybu :
    celek_pokus_vetrak.ino:53:28: error: expected primary-expression before ‚>‘ token

    a pokud to napisu takhle :
    if (dht1.readTemperature > 25.0)
    {
    digitalWrite(relePin1, LOW);
    if (dht1.readTemperature < 20.0)
    {
    digitalWrite(relePin1, HIGH);
    }
    }

    tak chybu to píše :
    error: invalid use of member function (did you forget the ‚()‘ ?)

    #2702
    Zbyšek Voda
    Účastník

    To asi bude tim, ze readTemperature je funkce volana na objektu dht1. A funkce potrebuji mit za sebou zavorky (i kdyz treba prazdne). Spravny zapis by tedy byl dht1.readTemperature().

    #2703
    tom.vitek
    Účastník

    je to tak! díky moc , takhle to vypadá a funguje to 🙂 ještě jednou díky

    if (dht1.readTemperature() >= 25.0)
    {
    digitalWrite(relePin1, LOW);
    if (dht1.readTemperature() <= 20.0)
    {
    digitalWrite(relePin1, HIGH);
    }
    }

    #2712
    tom.vitek
    Účastník

    Zdravím, mám tu prosím další problém se kterým si nevím rady:
    V tomto programu je ovládání výstupního relé pomocí teploty – funguje samo automaticky
    a dále je tu, že když sepnu tlačítko tak by se mělo sepnout i relé. A tady je ten kamen urazu po nahraní teplota automaticky řidí relé, ale když manualně zmačknu tlačítko abych seplo relé,když není seplé tak tato funkce nefunguje. Myslím že chyba bude třeba v rozmístění dané části programu nebo takoveho něco.

    Je možné že když jsou 2 IF v programu tak jedno program bere jako to hlavní a druhé podřadné?

    #include <DHT.h>
    #define DHT1PIN 7 //teplota
    #define DHT2PIN 6 // teplota 2
    #define DHT1TYPE DHT22 //definuje typ senzoru
    #define DHT2TYPE DHT22 //definuje typ senzoru
    DHT dht1(DHT1PIN, DHT1TYPE); //definuje typ senzoru
    DHT dht2(DHT2PIN, DHT2TYPE); //definuje typ senzoru
    const int buttonPin1 = 50; // kam je připojeno tlačítko
    const int relePin1 = 30; // kam je připojeno rele
    int buttonState = 0;

    void setup() {
    Serial.begin(9600);
    pinMode(relePin1, OUTPUT);
    pinMode(buttonPin1,INPUT);
    dht1.begin();
    dht2.begin();
    }

    void loop() {
    buttonState = digitalRead(buttonPin1);
    if (buttonState == HIGH) { // zapneme relé:
    digitalWrite(relePin1, LOW);
    }
    else {
    digitalWrite(relePin1, HIGH);
    } // vypneme relé:
    //automatické ovladani pomoci teploty
    if (dht1.readTemperature() >= 30) {
    digitalWrite(relePin1, LOW);
    }else{
    if (dht1.readTemperature() <= 28)
    digitalWrite(relePin1, HIGH);
    }
    //snímani teploty
    void teplotavlhkost();
    delay(4000);
    float h1 = dht1.readHumidity();
    float t1 = dht1.readTemperature();
    float h2 = dht2.readHumidity();
    float t2 = dht2.readTemperature();
    if (isnan(t1) || isnan(h1)) {
    Serial.println(„Failed to read from DHT #1“);
    }
    if (isnan(t2) || isnan(h2)) {
    Serial.println(„Failed to read from DHT #2“);
    }
    Serial.print(„T1:“);
    Serial.print(dht1.readTemperature(),1);
    Serial.print((char)223); // vypíše znak ° na displej
    Serial.print(„C „);
    }

    #2717
    Zbyšek Voda
    Účastník

    Problém bude v tom, že tak, jak máte program napsaný je opravdu správně chování, že při zmáčknutí tlačítka se relé vypne!

     if(buttonState == HIGH) { //!! tato funkce relé vypíná!
        digitalWrite(relePin1, LOW);
    }
    else{
        digitalWrite(relePin1, HIGH);
    } 

    Pokud chcete, aby stejný stav jako má relé mělo i tlačítko, musíte prohodit LOW a HIGH:

     if(buttonState == HIGH) {
        digitalWrite(relePin1, HIGH);
    }
    else{
        digitalWrite(relePin1, LOW);
    } 

    Dva IFy na stejné úrovni se rozhodně nedají brát jako „hlavní“ a „podřadný“. „Podřadnosti“ dosáhnete až jejich zanořováním 🙂

    #2718
    tom.vitek
    Účastník

    Prosím tě das mi na tebe tel kontakt nebo facebook ? funguje to přesně naopak než řikas

    #2719
    Zbyšek Voda
    Účastník

    FB buď Zbyšek Voda, nebo stačí napsat na stránku Arduino.cz na FB

    #3887
    tivvit
    Účastník

    Ahoj, použil jsem tento senzor venku (samozřejmě chráněný před vnějšími vlivy) teplotu měří správně ale po několika dnech začal vracet vlhkost 1.4 a tam se drží třeba několik hodin. Někdy na pár hodin začne měřit pak zas spadne na 1.4. Nějaký nápad čím by to mohlo být? Je to na výměnu? Je to tím že je venku (i když ve specicikaci je vlhkost až 100% a rozhodně na něj nenapršelo). Díky za názory

Aktuálně je na stránce zobrazeno 16 příspěvků - 1. až 16. (celkem z 16)
  • Pro reakci na toto téma se musíte přihlásit.