Arduino měření teploty

Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 7:43

Zdravím...už nějakou dobu se trápím s měřením teploty...

Nenašla by se dobrá duše která by mě pomohla s kodem?....věnuji se arduinu krátkou dobu takže tápu

Mám display 128x64

a teplotní senzory DS18B20

mám vzorové kody...kde dokážu provozovat 7 čidel( potřebuji měřit 7 teplot) a v seriálu si je vypisuju

na display dokážu vepsat jednoduchý text

umím si vybrat font aby se vešlo 7 hodnot na display

neumím naprogramovat aby se při určité teplotě seplo relé které sepne alarm

neumí složit oba kody tak aby se seriál print vypsal na display...

neumím upravit kod aby mělo každé čidlo svůj název

neumím programovat...jsem lama

jednoduché programy už zvládnu...mám nekolik knižek ale tohle je na mě moc

toto spojení senzorů a displaye sem na netu nenašel.....ale tuto velikost potřebuji

:?

https://dratek.cz/arduino/1187-teplotni ... 18b20.html

https://dratek.cz/arduino/1157-graficky ... iceni.html
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

8. 1. 2021, 8:22

Myslíš tydle dva programy:

Kód: Vybrat vše

// Grafický LCD display 128x64
// řadič ST7920

// připojení knihovny U8glib
#include "U8glib.h"

// nastavení propojovacích pinů
#define EN 13
#define RW 12
#define RS 11

// inicializace OLED displeje z knihovny U8glib
U8GLIB_ST7920_128X64_1X lcd(EN, RW, RS);

// proměnná pro uchování času poslední obnovy displeje
long int prepis = 0;

void setup(void) {
  // nastavení bílé barvy pro výpis
  if ( lcd.getMode() == U8G_MODE_R3G3B2 ) {
    lcd.setColorIndex(255);
  }
  // nastavení maximální intenzity svitu
  else if ( lcd.getMode() == U8G_MODE_GRAY2BIT ) {
    lcd.setColorIndex(3);
  }
  // nastavení viditelnosti pixelů
  else if ( lcd.getMode() == U8G_MODE_BW ) {
    lcd.setColorIndex(1);
  }
  // pro otočení displeje o 180 stupňů
  // stačí odkomentovat řádek níže
  // lcd.setRot180();
}

void loop(void) {
  // porovnání uloženého a aktuálního času,
  // při rozdílu větším než 100 ms se provede
  // obnovení displeje, čas můžeme nastavit dle potřeby
  if (millis()-prepis > 100) {
    // následující skupina příkazů
    // obnoví obsah OLED displeje
    lcd.firstPage();
    do {
      // funkce vykresli vykreslí žádanou obsah
      vykresli();
    } while( lcd.nextPage() );
    // uložení posledního času obnovení
    prepis = millis();
  }
  
  // zde je místo pro další příkazy pro Arduino
  
  // volitelná pauza 10 ms pro demonstraci
  // vykonání dalších příkazů
  delay(10);
}
// funkce vykresli pro nastavení výpisu informací na OLED
void vykresli(void) {
  // nastavení písma, toto písmo umožní vypsat
  // přibližně 15x4 znaků
  lcd.setFont(u8g_font_unifont);
  // nastavení pozice výpisu v pixelech
  // souřadnice jsou ve tvaru x, y
  // souřadnice 0, 0 je v levém horní rohu
  // OLED displeje, maximum je 128, 64
  lcd.setPrintPos(0, 10);
  // výpis textu na zadanou souřadnici
  lcd.print("Arduino navody");
  lcd.setPrintPos(0, 25);
  lcd.print("arduino-shop.cz");
  lcd.setPrintPos(0, 40);
  lcd.print("Cas od zapnuti:");
  lcd.setPrintPos(40, 55);
  lcd.print(millis()/1000);
  lcd.print(" vterin");
}

Kód: Vybrat vše

#include <OneWire.h>
#include <DallasTemperature.h>

#define BUS_PIN 4
#define ADR_SIZE 8 //byte

//vytvoreni instanci
OneWire Bus(BUS_PIN);
DallasTemperature Sensors(&Bus);
DeviceAddress DevAdr;

uint8_t nSensors = 0;

void printAddress(DeviceAddress devAdr, uint8_t idx);
void getTemp();

void printAddress(DeviceAddress devAdr, uint8_t idx)
{
  Serial.print("Adresa senzoru ");
  Serial.print(idx + 1);
  Serial.print(": ");

  for (uint8_t i = 0; i < ADR_SIZE; i++)
  {
    if (devAdr[i] < 16) Serial.print("0");
    Serial.print(devAdr[i], HEX);
  }
  Serial.println();
}

void getTemp(){
  Sensors.requestTemperatures();

  for (uint8_t i = 0; i < nSensors; i++)
  {
    Serial.print("Teplota cidla ");
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.println(Sensors.getTempCByIndex(i));
  }
  Serial.println("****************************");
  delay(2000);
}

void setup(void) {
  Serial.begin(9600);
  Sensors.begin();

  //pocet senzoru
  nSensors = Sensors.getDeviceCount();

  //vypis poctu senzoru
  Serial.print("Pocet senzoru: ");
  Serial.println(nSensors);

  //vypis adres senzoru
  for (uint8_t i = 0; i < nSensors; i++)
  {
    Sensors.getAddress(DevAdr, i);
    printAddress(DevAdr, i);
  }
  Serial.println("****************************");
}

void loop(void) {
  //cteni teploty
  getTemp();
}
?
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 8:23

Ano to jsou ty programy
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Uživatelský avatar
Cjuz
Příspěvky: 2422
Registrován: 17. 2. 2013, 6:27
Bydliště: Předklášteří
Kontaktovat uživatele:

8. 1. 2021, 9:34

Zatím bez komentáře bo není čas, ale tohle jsem slepil nedávno za 5 minut z šuplíkových zásob abych si mohl měřit teplotu a vlhkost na půdě.
měří a ukazuje aktuální min a max

Prozkoumej jako inspiraci, třeba se chytíš a případně se pak na to co chceš, mrkneme

Kód: Vybrat vše

// LCD displej
// navody.arduino-shop.cz
/*
 * LCD RS pin na digital pin 3
 * LCD Enable pin na digital pin 4
 * LCD D4 pin na digital pin 5
 * LCD D5 pin na digital pin 8
 * LCD D6 pin na digital pin 9
 * LCD D7 pin na digital pin 10
 * LCD R/W pin na GND
 * LCD VSS pin na GND
 * LCD VCC pin na 5V
 * LCD V0 pin přes odpor na zem
 *  (kontrast)
 */

// knihovna pro LCD displej
#include <LiquidCrystal.h>

// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(3, 4, 5, 8, 9, 10);

#include <SimpleDHT.h>

int pinDHT22 = 13;
SimpleDHT22 dht22;

float temp_max = 0;
float temp_min = 0;

float humi_max = 0;
float humi_min = 0;

  float temperature = 0;
  float humidity = 0;
  int err = SimpleDHTErrSuccess;

void setup() {
lcd.begin(20, 4);
delay(100);

 Serial.begin(9600);


  
//  temp_max = temperature;
  temp_min = 100;
  humi_min = 100;
 // humi_max = humidity;
}




void loop() {


  if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(1000);
    return;
  }
  
  Serial.print((float)temperature);
  Serial.print(",");
  Serial.println((float)humidity);

if (temp_max < temperature){
  temp_max = temperature;
}
if (temp_min > temperature){
  temp_min = temperature;
}

if (humi_min > humidity){
  humi_min= humidity;
}
if (humi_max < humidity){
  humi_max = humidity;
}

lcd.clear();
  
lcd.setCursor ( 0, 0 );
lcd.print("Teplota ");
lcd.print((float)temperature, 1);
lcd.print("C");

lcd.setCursor ( 15, 0 );
lcd.print((float)temp_max, 1);
lcd.setCursor ( 15, 1 );
lcd.print((float)temp_min, 1);

lcd.setCursor ( 0, 2 );
lcd.print("Vlhkost ");
lcd.print((float)humidity, 1);
lcd.print("%");

lcd.setCursor ( 15, 2 );
lcd.print((float)humi_max, 1);
lcd.setCursor ( 15, 3 );
lcd.print((float)humi_min, 1);

  
  // DHT22 sampling rate is 0.5HZ.
  delay(1000);

}
Na konci poznávacího procesu je omyl zcela vyvrácen a my nevíme nic. Zato to víme správně.
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 9:52

Cjuz píše: 8. 1. 2021, 9:34 Zatím bez komentáře bo není čas, ale tohle jsem slepil nedávno za 5 minut z šuplíkových zásob abych si mohl měřit teplotu a vlhkost na půdě.
měří a ukazuje aktuální min a max

Prozkoumej jako inspiraci, třeba se chytíš a případně se pak na to co chceš, mrkneme

Kód: Vybrat vše

// LCD displej
// navody.arduino-shop.cz
/*
 * LCD RS pin na digital pin 3
 * LCD Enable pin na digital pin 4
 * LCD D4 pin na digital pin 5
 * LCD D5 pin na digital pin 8
 * LCD D6 pin na digital pin 9
 * LCD D7 pin na digital pin 10
 * LCD R/W pin na GND
 * LCD VSS pin na GND
 * LCD VCC pin na 5V
 * LCD V0 pin přes odpor na zem
 *  (kontrast)
 */

// knihovna pro LCD displej
#include <LiquidCrystal.h>

// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(3, 4, 5, 8, 9, 10);

#include <SimpleDHT.h>

int pinDHT22 = 13;
SimpleDHT22 dht22;

float temp_max = 0;
float temp_min = 0;

float humi_max = 0;
float humi_min = 0;

  float temperature = 0;
  float humidity = 0;
  int err = SimpleDHTErrSuccess;

void setup() {
lcd.begin(20, 4);
delay(100);

 Serial.begin(9600);


  
//  temp_max = temperature;
  temp_min = 100;
  humi_min = 100;
 // humi_max = humidity;
}




void loop() {


  if ((err = dht22.read2(pinDHT22, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT22 failed, err="); Serial.println(err);delay(1000);
    return;
  }
  
  Serial.print((float)temperature);
  Serial.print(",");
  Serial.println((float)humidity);

if (temp_max < temperature){
  temp_max = temperature;
}
if (temp_min > temperature){
  temp_min = temperature;
}

if (humi_min > humidity){
  humi_min= humidity;
}
if (humi_max < humidity){
  humi_max = humidity;
}

lcd.clear();
  
lcd.setCursor ( 0, 0 );
lcd.print("Teplota ");
lcd.print((float)temperature, 1);
lcd.print("C");

lcd.setCursor ( 15, 0 );
lcd.print((float)temp_max, 1);
lcd.setCursor ( 15, 1 );
lcd.print((float)temp_min, 1);

lcd.setCursor ( 0, 2 );
lcd.print("Vlhkost ");
lcd.print((float)humidity, 1);
lcd.print("%");

lcd.setCursor ( 15, 2 );
lcd.print((float)humi_max, 1);
lcd.setCursor ( 15, 3 );
lcd.print((float)humi_min, 1);

  
  // DHT22 sampling rate is 0.5HZ.
  delay(1000);

}
ahoj děkuju.
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

8. 1. 2021, 10:26

Modros píše: 8. 1. 2021, 8:23 Ano to jsou ty programy
Hmm, možná nějak takto (doufám, že jsem jakž takž pochopil tu lcd do-while smyčku):

Kód: Vybrat vše

#include <OneWire.h>
#include <DallasTemperature.h>
#include "U8glib.h"

#define PIN_LCD_EN 13
#define PIN_LCD_RW 12
#define PIN_LCD_RS 11
#define SENSOR_BUS_PIN 4
#define ALARM_PIN 5
#define ALARM_TEMPERATURE 50.0

OneWire Bus(SENSOR_BUS_PIN);
DallasTemperature Sensors(&Bus);
DeviceAddress DevAdr;

U8GLIB_ST7920_128X64_1X lcd(PIN_LCD_EN, PIN_LCD_RW, PIN_LCD_RS);

uint8_t nSensors = 0;
float temperatures[7]; // for nSensors <= 7

void setup(void) {
  pinMode(ALARM_PIN, OUTPUT);
  digitalWrite(ALARM_PIN, LOW);

  if (lcd.getMode() == U8G_MODE_R3G3B2) {
    lcd.setColorIndex(255);
  } else if (lcd.getMode() == U8G_MODE_GRAY2BIT) {
    lcd.setColorIndex(3);
  } else if (lcd.getMode() == U8G_MODE_BW) {
    lcd.setColorIndex(1);
  }
  //lcd.setRot180();

  Serial.begin(9600);
  
  Sensors.begin();
  nSensors = Sensors.getDeviceCount();
  
  Serial.print("Pocet senzoru: ");
  Serial.println(nSensors);
  Serial.println("****************************");
}

void loop(void) {
  readoutTemperatures();
  renderToSerialAndResolveAlarmSignal();
  renderToLcd();
  delay(1000);
}

void readoutTemperatures(){  
  Sensors.requestTemperatures();
  
  for (uint8_t i = 0; i < nSensors; i++) {
    temperatures[i] = Sensors.getTempCByIndex(i);
  }
}

void renderToSerialAndResolveAlarmSignal() {  
  for (uint8_t i = 0; i < nSensors; i++) {
    float temperature = temperatures[i];
    boolean alarm = temperature >= ALARM_TEMPERATURE;

    Serial.print(getSensorName(i));
    Serial.print(": ");
    Serial.println(temperature);
    
    if (alarm) {
      Serial.println("!!! ALARM !!!");
      digitalWrite(ALARM_PIN, HIGH);
    }    
  }

  Serial.println("****************************");
}

void renderToLcd() {
  lcd.firstPage();
  do {
    renderToLcdSub();
  } while(lcd.nextPage());
}

void renderToLcdSub() {
  lcd.setFont(u8g_font_unifont);

  for (uint8_t i = 0; i < nSensors; i++) {
    float temperature = temperatures[i];
    boolean alarm = temperature >= ALARM_TEMPERATURE;

    lcd.setPrintPos(0, i * 9);
    lcd.print(getSensorName(i));
    lcd.print(": ");
    lcd.print(temperature);

    if (alarm) {
      lcd.print(" !!!");
    }    
  }
}

String getSensorName(uint8_t i) {
  switch (i) {
    case 0: return "Lednice";
    case 1: return "Spizirna";
    case 2: return "Sklep";
    case 3: return "Puda";
    case 4: return "Garaz";
    case 5: return "Frezka";
    case 6: return "Kocour";
    default:
      return "???";
  }
}


Je to nástřel, minimálně ta renderToLcdSub bude chtít poladit..

Dej vědět, T.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 10:59

Tak to je mazec...nechápu....funguje to....mám teda ted připojene 4 čidla a na serial se ukazoujou 4 a na displayi jen 3 ale zitra udělám komplet 7 čidel a budu testovat...změnil sem unifont na helvR8 a ted mám cca 8 řádků....zatím tisíckrát děkuju
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 11:10

Po alarmu který sem nastavil na 25 stupnu se zobrazej vykřičníky u příslušné teploty a dal sem si na pin 5 diodu...zapne jí to...ale po opadnutí teploty už nezhasne.....možná to nechám a dám resetovací tlačítko dokud to nevyresetuju tak to bude řvát
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

8. 1. 2021, 11:15

Modros píše: 8. 1. 2021, 10:59 na serial se ukazoujou 4 a na displayi jen 3
Možná změnit

Kód: Vybrat vše

lcd.setPrintPos(0, i * 9);
na

Kód: Vybrat vše

lcd.setPrintPos(0, (i + 1) * 9);
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

8. 1. 2021, 11:20

Modros píše: 8. 1. 2021, 11:10 Po alarmu který sem nastavil na 25 stupnu se zobrazej vykřičníky u příslušné teploty a dal sem si na pin 5 diodu...zapne jí to...ale po opadnutí teploty už nezhasne.....možná to nechám a dám resetovací tlačítko dokud to nevyresetuju tak to bude řvát
Jj, přesně tak jsem to pojal (jakože shození alarmu je na obsluze). Taková improvizace, nijak jsi to nespecifikoval.

Jinak těší mě, že to fachčí, rádo se stalo :)

Dobrou, T.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

8. 1. 2021, 11:23

Thomeeque píše: 8. 1. 2021, 11:15
Modros píše: 8. 1. 2021, 10:59 na serial se ukazoujou 4 a na displayi jen 3
Možná změnit

Kód: Vybrat vše

lcd.setPrintPos(0, i * 9);
na

Kód: Vybrat vše

lcd.setPrintPos(0, (i + 1) * 9);
jasný....nevypisoval se kanál 0 lednice
zatím mockrát děkuju....já s tím mám nervy 4 dny....a ty to uděláš za 10 minut.... :roll:
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

9. 1. 2021, 8:13

Ahoj jeste otazka...ted to mam nabastleny na original Uno, pujde tenhle komplet kod na Nano? mam Nano se sroubovacim terminalem a zastavbove by se me to vychazelo lip
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

9. 1. 2021, 8:49

Já jsem se na tom SW pro tvůj teploměr nijak nepodílel.
Ale Uno a Nano je to samé, jenom na jiném formátu desky. Takže ano, pojede to i na desce Nano.
Modros
Příspěvky: 1678
Registrován: 31. 3. 2019, 7:58

9. 1. 2021, 8:57

Mex píše: 9. 1. 2021, 8:49 Já jsem se na tom SW pro tvůj teploměr nijak nepodílel.
Ale Uno a Nano je to samé, jenom na jiném formátu desky. Takže ano, pojede to i na desce Nano.
dekuji moc.
Masso, stroje všemožný, autoservis, amatérské závody Nissan GTR
Uživatelský avatar
Thomeeque
Příspěvky: 8912
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

9. 1. 2021, 9:33

Modros píše: 8. 1. 2021, 11:23 jasný....nevypisoval se kanál 0 lednice
Jj, musí se pozicovat levý spodní roh prvního písmene, já pozicoval horní (display má y=0 nahoře, tak by to taky dávalo smysl).

Modros píše: 8. 1. 2021, 11:23 zatím mockrát děkuju....já s tím mám nervy 4 dny....a ty to uděláš za 10 minut.... :roll:
Ten umí to a ten zas tohle :) Ale trvalo mi to trochu dýl, práce s tím displayem je trochu zvláštní, zatím jsem se s něčím takovým nesetkal (mluvím o té do-while smyčce). To je celkem komplikace, jinak by se to dalo napsat o dost jednodušeji.

Teď, když si to čteš, chápeš, jak to funguje? Klidně se zeptej. Určitě je na tom co vylepšovat (aby třeba i z displaye bylo jasné, z kterého senzoru vzešel alarm i potom, co teplota opět klesla atp.).

Zatim, T.
Naposledy upravil(a) Thomeeque dne 9. 1. 2021, 9:39, celkem upraveno 1 x.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Odpovědět

Zpět na „Ostatní elektronika“