teploměr

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
dobi
Příspěvky: 6
Registrován: 16 úno 2021, 21:09
Reputation: 0

teploměr

Příspěvek od dobi » 17 úno 2021, 11:40

Dobrý den, snažím se pomocí arduina uno, Hodinového displeje TM1637, teploměru dht 11 a pár ledek udělat teploměr na displeji se teplota ukazuje, snažím se to udělat tak aby, když se například teplota bude rovnat 22 stupňům aby svítila zelená led dioda a když bude teplota pod 20 stupňů tak aby svítila modrá. Pořád se mi nedaří udělat správně kód, protože vždy svítí pouze jedna barva ať je jakakoliv teplota. Prosím o pomoc.
Zde je kód:

Kód: Vybrat vše


int zelena = A0;
int cervena = A1;
int modra = A2;
int zluta = A3;

#include "DHT.h"
#define typDHT11 DHT11
#define pinDHT 5
DHT mojeDHT(pinDHT, typDHT11);
// Include the libraries:
#include <TM1637Display.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Define the connections pins:
#define CLK 2
#define DIO 3
#define DHTPIN 4

// Create variable:
int temperature_celsius;
int temperature_fahrenheit;

// Create degree Celsius symbol:
const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Circle
  SEG_A | SEG_D | SEG_E | SEG_F   // C
};

// Create degree Fahrenheit symbol:
const uint8_t fahrenheit[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Circle
  SEG_A | SEG_E | SEG_F | SEG_G   // F
};

// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Create display object of type TM1637Display:
TM1637Display display = TM1637Display(CLK, DIO);
// Create dht object of type DHT:
DHT dht = DHT(DHTPIN, DHTTYPE);

void setup() {
  pinMode(zelena, OUTPUT);
  pinMode(modra, OUTPUT);
  pinMode(cervena, OUTPUT);
  pinMode(zluta, OUTPUT);
// Set the display brightness (0-7):
  display.setBrightness(0);
  // Clear the display:
  display.clear();
  // Setup sensor:
  dht.begin();
  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
  // Wait for console opening:
  delay(2000);
}

void loop() {
  // Read the temperature as Celsius and Fahrenheit:
  temperature_celsius = dht.readTemperature();
  temperature_fahrenheit = dht.readTemperature(true);
  // Print the temperature to the Serial Monitor:
  Serial.println(temperature_celsius);
  Serial.println(temperature_fahrenheit);

  // Show the temperature on the TM1637 display:
  display.showNumberDec(temperature_celsius, false, 2, 0);
  display.setSegments(celsius, 2, 2);

  delay(2000);

  //display.showNumberDec(temperature_fahrenheit, false, 2, 0);
  //display.setSegments(fahrenheit, 2, 2);

 // delay(2000);
  float teplota = mojeDHT.readTemperature();
  //float vlhkost = mojeDHT.readHumidity();

  if (isnan(teplota)){
    Serial.println("Chyba při čtení z DHT senzoru!");
  } else {
    Serial.print("Teplota: ");
    Serial.print(teplota);
    Serial.print(" stupnu Celsia, ");
    //Serial.print("vlhkost: ");
    //Serial.print(vlhkost);
    //Serial.println("  %");
  }

   if (teplota = 22){ 
    digitalWrite(zelena, HIGH);
  }

  else if (teplota = 24){ 
    digitalWrite(zluta, HIGH);
  }

  else if (teplota > 20){ 
    digitalWrite(modra, HIGH);
  }

  else if (teplota < 26){ 
    digitalWrite(cervena, HIGH);
  }
 delay(100);

    digitalWrite(zelena, LOW);
    digitalWrite(modra, LOW);   
    digitalWrite(cervena, LOW);
    digitalWrite(zluta, LOW);

}

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: teploměr

Příspěvek od KamilV » 17 úno 2021, 12:06

= je operátor přiřazení
např. teplota = 20 se čte jako "do teplota přiřaď hodnotu 20"

== je operátor porovnání
např. if (teplota == 20) se čte jako "pokud se teplota rovná hodnotě 20"

Ve Tvém případě bude vždy svítit zelená, protože hodnotu 22 se vždy podaří do teplota přiřadit

Až budeš IF upravovat, pozor na to, že teplota je float a téměř nikdy nebude přesně 22, buď si ji přetypuj na int, nebo tam dej také meze od do.
if (teplota > 21.5 && teplota < 22.5)

dobi
Příspěvky: 6
Registrován: 16 úno 2021, 21:09
Reputation: 0

Re: teploměr

Příspěvek od dobi » 17 úno 2021, 16:58

Až budeš IF upravovat, pozor na to, že teplota je float a téměř nikdy nebude přesně 22, buď si ji přetypuj na int, nebo tam dej také meze od do.
if (teplota > 21.5 && teplota < 22.5)
[/quote]

Děkuji za pomoc, ale ikdyž to udělám takhle pořád to nefuguje.
float teplota = mojeDHT.readTemperature();

if (isnan(teplota)){
Serial.println("Chyba při čtení z DHT senzoru!");
} else {
Serial.print("Teplota: ");
Serial.print(teplota);
Serial.print(" stupnu Celsia, ");

}

if (teplota > 21,5 && teplota < 23){
digitalWrite(zelena, HIGH);
}

else if (teplota > 23,5 && teplota < 25){
digitalWrite(zluta, HIGH);
}

else if (teplota > 0 && teplota < 21){
digitalWrite(modra, HIGH);
}

else if (teplota > 25,5 && teplota < 30){
digitalWrite(cervena, HIGH);
}
delay(1000);

digitalWrite(zelena, LOW);
digitalWrite(modra, LOW);
digitalWrite(cervena, LOW);
digitalWrite(zluta, LOW);

}

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: teploměr

Příspěvek od KamilV » 17 úno 2021, 17:04

Vždyť to s těma čárkama nemohlo jít ani zkompilovat.
Navíc co když bude naměřená teplota 23.2? Který IF to zachytí, když nepokrývají celou číselnou osu?

Kód: Vybrat vše

if (teplota <= 21.0){
	digitalWrite(modra, HIGH);
}

else if (teplota > 21.0 && teplota <= 23.0){
	digitalWrite(zelena, HIGH);
}

else if (teplota > 23.0 && teplota <= 25.0){
	digitalWrite(zluta, HIGH);
}

else
	digitalWrite(cervena, HIGH);
}

dobi
Příspěvky: 6
Registrován: 16 úno 2021, 21:09
Reputation: 0

Re: teploměr

Příspěvek od dobi » 18 úno 2021, 21:19

Já se moc omlouvám že obtěžuji, ale ani takhle to nefunguje.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: teploměr

Příspěvek od KamilV » 18 úno 2021, 22:04

Nikoho to určitě neobtěžuje, psal jsem to od boku, takže tam nějaká chyba být může.
Co znamená, že to nefunguje? Vrátí něco kompilátor?
A když se před první if dá

Kód: Vybrat vše

Serial.println(teplota);
vypíše to co?

Protože ze slov "nefunguje to" se nedá nic poznat :(

EDIT: aha, ten print už tam je, takže jen: co se objeví na Serialu?
EDIT2: jo, třeba u posledního else mi chybí složená závorka, jak jsem to umazával z "else if(...){", tu sis tam ale dospal, že jo? :)
Naposledy upravil(a) KamilV dne 18 úno 2021, 22:12, celkem upraveno 1 x.

dobi
Příspěvky: 6
Registrován: 16 úno 2021, 21:09
Reputation: 0

Re: teploměr

Příspěvek od dobi » 18 úno 2021, 22:10

Nefunguje to tak že žádná led dioda nesvítí, na seriovém monitoru se zobrazuje teplota a vlhkost.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: teploměr

Příspěvek od KamilV » 18 úno 2021, 22:14

Jaká teplota se vypíše na Serial?
A pošli prosím aktuální úplný kód.

dobi
Příspěvky: 6
Registrován: 16 úno 2021, 21:09
Reputation: 0

Re: teploměr

Příspěvek od dobi » 19 úno 2021, 18:33

Výstřižek.PNG
Výstřižek.PNG (9.63 KiB) Zobrazeno 2927 x
toto píše serial.
zde je kod:

Kód: Vybrat vše


int zelena = A0;
int cervena = A1;
int modra = A2;
int zluta = A3;

#include "DHT.h"
#define typDHT11 DHT11
#define pinDHT 5
DHT mojeDHT(pinDHT, typDHT11);
// Include the libraries:
#include <TM1637Display.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Define the connections pins:
#define CLK 2
#define DIO 3
#define DHTPIN 4

// Create variable:
int temperature_celsius;
int temperature_fahrenheit;

// Create degree Celsius symbol:
const uint8_t celsius[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Circle
  SEG_A | SEG_D | SEG_E | SEG_F   // C
};

// Create degree Fahrenheit symbol:
const uint8_t fahrenheit[] = {
  SEG_A | SEG_B | SEG_F | SEG_G,  // Circle
  SEG_A | SEG_E | SEG_F | SEG_G   // F
};

// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Create display object of type TM1637Display:
TM1637Display display = TM1637Display(CLK, DIO);
// Create dht object of type DHT:
DHT dht = DHT(DHTPIN, DHTTYPE);

void setup() {
  pinMode(zelena, OUTPUT);
  pinMode(modra, OUTPUT);
  pinMode(cervena, OUTPUT);
  pinMode(zluta, OUTPUT);
// Set the display brightness (0-7):
  display.setBrightness(0);
  // Clear the display:
  display.clear();
  // Setup sensor:
  dht.begin();
  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
  // Wait for console opening:
  delay(2000);
}

void loop() {
  // Read the temperature as Celsius and Fahrenheit:
  temperature_celsius = dht.readTemperature();
  temperature_fahrenheit = dht.readTemperature(true);
  // Print the temperature to the Serial Monitor:
  Serial.println(temperature_celsius);
  Serial.println(temperature_fahrenheit);

  // Show the temperature on the TM1637 display:
  display.showNumberDec(temperature_celsius, false, 2, 0);
  display.setSegments(celsius, 2, 2);

  delay(2000);

  //display.showNumberDec(temperature_fahrenheit, false, 2, 0);
  //display.setSegments(fahrenheit, 2, 2);

 float teplota = mojeDHT.readTemperature();
//float vlhkost = mojeDHT.readHumidity();

  if (isnan(teplota)){
    //Serial.println("Chyba při čtení z DHT senzoru!");
  } else {
    Serial.print("Teplota: ");
    Serial.print(teplota);
    Serial.print(" stupnu Celsia, ");
    //Serial.print("vlhkost: ");
    //Serial.print(vlhkost);
    //Serial.println("  %");
 
  }
   
    
   
    if (teplota <= 21.0){
    digitalWrite(modra, HIGH);
    }

    else if (teplota > 21.0 && teplota <= 23.0){
    digitalWrite(zelena, HIGH);
    }

    else if (teplota > 23.0 && teplota <= 25.0){
    digitalWrite(zluta, HIGH);
    }

    else if (teplota > 25.0 && teplota <= 30){ 
    digitalWrite(cervena, HIGH);
    }

}

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: teploměr

Příspěvek od KamilV » 19 úno 2021, 22:05

Proč děláš 2 instance, DHT a mojeDHT? Na serial to posilas jen z DHT. U mojeDHT testujes isnan, ale vystup na Serial mas zakomentovany. Proc? Patrne prave tam to konci...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů