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: ovládání výstupu, rele, teplota
- 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.
-
AutorPříspěvky
-
23.2.2015 v 14:25 #2644tom.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.
23.2.2015 v 14:26 #2645tom.vitekÚčastník23.2.2015 v 17:00 #2647Zbyšek VodaÚčastníkDobrý 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/:)
23.2.2015 v 17:34 #2649tom.vitekÚčastníkjo, měl jste pravdu bylo to knihovnou. Díky moc už to měří jak má 🙂
23.2.2015 v 17:36 #2650tom.vitekÚčastníkješ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 ?
23.2.2015 v 17:41 #2651Zbyšek VodaÚčastníkTomu 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.10.3.2015 v 10:16 #2699tom.vitekÚčastníkAhoj, 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 stepbyte 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
10.3.2015 v 10:24 #2700Zbyšek VodaÚčastníkNebude chyba v tom, ze cisla zabalujete do uvozovek? On je pak program bere jako String a ne jako cislo 😉
10.3.2015 v 10:59 #2701tom.vitekÚčastníkaha, 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 ‚>‘ tokena 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 ‚()‘ ?)10.3.2015 v 11:34 #2702Zbyšek VodaÚčastníkTo 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().
10.3.2015 v 11:42 #2703tom.vitekÚčastníkje 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);
}
}11.3.2015 v 11:06 #2712tom.vitekÚčastníkZdraví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 „);
}11.3.2015 v 13:17 #2717Zbyšek VodaÚčastníkProblé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 🙂
11.3.2015 v 14:04 #2718tom.vitekÚčastníkProsím tě das mi na tebe tel kontakt nebo facebook ? funguje to přesně naopak než řikas
11.3.2015 v 14:30 #2719Zbyšek VodaÚčastníkFB buď Zbyšek Voda, nebo stačí napsat na stránku Arduino.cz na FB
29.7.2015 v 20:25 #3887tivvitÚčastníkAhoj, 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
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.