Teploměr s DS18b20 a LED display

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#31 Příspěvek od Cowley »

A mě ještě neodpověděl, co mu to vypisuje v Serial Monitoru?
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#32 Příspěvek od buchar »

Zatím jsem nahrál nový kód jen do jednoho teploměru, ale všechny jsou úplně stejné.
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#33 Příspěvek od buchar »

Cowley: V serial monitoru to ukazuje stejnou hodnotu co na displeji, pouze se dvěma desetinnými místy.

Dumitru: Zatím jsem nahrál nový kód jen do jednoho teploměru, ale všechny jsou úplně stejné.
Uživatelský avatar
Dumitru
Příspěvky: 254
Registrován: 11 pro 2015, 00:00
Bydliště: Slovensko,Bratislava
Kontaktovat uživatele:

#34 Příspěvek od Dumitru »

buchar píše:Cowley: V serial monitoru to ukazuje stejnou hodnotu co na displeji, pouze se dvěma desetinnými místy.

Dumitru: Zatím jsem nahrál nový kód jen do jednoho teploměru, ale všechny jsou úplně stejné.



A skús do všetkých to nahrať nech vieme na 100% že budú ukazovať správne po zmene sw


Potom daj sem C kód a ja budem mať večer čas tak sa nato pozriem :) ak to nevyrieši niekto skôr ;)
Naposledy upravil(a) Dumitru dne 20 dub 2024, 14:41, celkem upraveno 1 x.
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#35 Příspěvek od pocitujlasku »

ja meranie robim tak, ze si nastavim premennu +pocet sekund o kolko chcem dalsie meranie a to porovnavam s millis. ak je vacsie, tak poslem prikaz na meranie a zase nastavim na +1s. a potom precitam teplotu a zas nastavim na dalsie meranie.
Takze sa mi neblokuje kod, a viem si nastavit interval ako casto ma merat.
Dal by som aj konkretny kod, ale mam ho ako sucast vacsieho projektu a nechce sa mi to vyzobavat.
No vidis, a tak si sa bal
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#36 Příspěvek od buchar »

Dumitru, mám jen jednu ATmegu168 a na zbývajících plošných spojích bych to musel malinko upravit. Musel bych je rozebrat a přepojit dva piny procesoru. Kód z Arduina se mi nechtěl nahrát, když byli zapojeny RX a TX na piny displeje. Ale jak jsem psal, všechny tři teploměry jsou identické.
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#37 Příspěvek od buchar »

Při čekání na další vaši radu jsem nezahálel a přemýšlel jak nacpat kód do ATmegy8. Nakonec jsem pouze zakomentoval dva řádky pro serial monitor a bylo vymalováno. Nahrál jsem tedy kód od Valdano do ATmegy8 a osadil do zapojení. Jaké bylo moje překvapení, když se zobrazila teplota o 2°C nižší. Vytáhl jsem tedy ještě dvě zbývající A8 ze šuplíku a nahrál. Se všemi třemi A8 ukazuje teploměr teplotu o 2°C nižší než s A168.
Nevím jaký je mezi nimi rozdíl, kromě místa pro program, ale znalejší to asi budou vědět, proč ten teplotní rozdíl.
Jinak dislej pořád mrká.
Máte nějaké další nápady?
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#38 Příspěvek od Valdano »

To, že to stále bliká je divné podobně jako ta odchylka 2°C u ATmegy8. Nejprve jste psal, že starý teploměr co jste dělal cca před dvěma lety ukazuje teplotu o 2°C vyšší a teď zas píšete, že s ATmegy8 ten příklad pro Arduino ukazuje teplotu o 2°C nižší zatímco s ATmegu168 ukazuje správně. To jsou tedy tři varianty a každá z nich zobrazuje teplotu jinak.

Mimochodem zdroják pro Arduino co zde uvádím je v céčku, a to složitost je schovaná v té knihovně, ale jinak je to jen céčko a nic jiného.

1. Zkontrolujte jak starou verzi knihovny DallasTemperature máte. Poslední verze je tato. Když se podíváte do adresáře kde máte nainstalováno vývojové prostředí pro Arduino a v tom adresáři do podadresáře libraries a dále DallasTemperature tak v něm by měl být soubor library.properties.

adresar_arduina\libraries\DallasTemperature\library.properties

a v tom souboru je řádek začínající version= a za tím je uvedeno číslo verze té knihovny.

2. Zkuste změřit dobu trvání requestTemperatures() viz níže upravený příklad a napište jaké číslo se zobrazuje (pozn. měla by to být doba trvání v milisekundách). Pokud v knihovně funguje neblokující režim tak by to číslo mělo být malé.

Kód: Vybrat vše

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

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);

#include "SevSeg.h"
SevSeg sevseg;

const unsigned long eventInterval = 1000;
unsigned long previousTime = 0;
unsigned long currentTime = 0;
unsigned long dobaTrvani = 0;
byte numDigits = 4;
byte digitPins[] = {A5, A4, A3, A2};
byte segmentPins[] = {2, 13, 6, 4, 3, 12, 7, 5};
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = true;
bool leadingZeros = false;
bool disableDecPoint = false;
bool cekaniNaKonverzi = false;
float tempC;

void setup()
{
  sensor.begin();
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
               resistorsOnSegments, updateWithDelays, leadingZeros,
               disableDecPoint);
  sevseg.setBrightness(90);
  sensor.setResolution(11);
}

void loop()
{
  currentTime = millis();

  if (!cekaniNaKonverzi && (currentTime - previousTime) >= eventInterval) {
    previousTime = currentTime;
    // nastavit neblokující volání
    sensor.setWaitForConversion(false);
    // následující volání skončí hned bez čekání a konverze bude probíhat na pozadí
    // na dokončení konverze se bude čekat bez blokování viz níže
    currentTime = millis();
    sensor.requestTemperatures();
    dobaTrvani = millis() - currentTime;
    // nastavit příznak neblokujícího čekání na dokončení konverze dat senzoru na pozadí
    cekaniNaKonverzi = true;
  };

  if (cekaniNaKonverzi) {
    // neblokující dotaz zda konverze dat na pozadí již byla dokončena
    if (sensor.isConversionComplete()) {
      // konverze dat dokončena
      cekaniNaKonverzi = false;
      // teprve nyní načíst a zobrazit data
      // a to by již mělo být rychlé bez bliknutí

      // zde namísto výpisu teploty jen výpis doby trvání
      sevseg.setNumber((int32_t)dobaTrvani);

      // dočasne zakomentováno
      // tempC = sensor.getTempCByIndex(0);
      // sevseg.setNumberF(tempC, 1);
    };
  };

  sevseg.refreshDisplay();
}
Naposledy upravil(a) Valdano dne 21 dub 2024, 15:36, celkem upraveno 2 x.
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#39 Příspěvek od buchar »

Zdravím vás Valdano, omlouvám se za pozdější reakci, ale byl jsem asi hodinu mimo domov.
1. verze knihovny je 3.8.0
2. na displeji je č.2 a občas se ukáže 3
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#40 Příspěvek od Valdano »

buchar píše:1. verze knihovny je 3.8.0

Zkuste tu vaši verzi knihovny nahradit tou odkazovanou tj. myslím 3.9.0.

buchar píše:2. na displeji je č.2 a občas se ukáže 3

Neblokující režim tedy funguje. Problém s časem zdá se není ve sensor.requestTemperatures().

Bliká vám displej i když je řádek s tempC = sensor.getTempCByIndex(0) dočasně zakomentován a nevolá se a nebo v této úpravě nebliká?
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#41 Příspěvek od buchar »

Při zakomentování řádku "tempC = sensor.getTempCByIndex(0)" displej nebliká.
Knihovnu hned aktualizuji.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#42 Příspěvek od Valdano »

Zkuste tedy zda to bude nebo nebude blikat s upravenýn příkladem níže.

Kód: Vybrat vše

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

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
static DeviceAddress deviceAddress;

#include "SevSeg.h"
SevSeg sevseg;

const unsigned long eventInterval = 1000;
unsigned long previousTime = 0;
unsigned long currentTime = 0;
byte numDigits = 4;
byte digitPins[] = {A5, A4, A3, A2};
byte segmentPins[] = {2, 13, 6, 4, 3, 12, 7, 5};
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = true;
bool leadingZeros = false;
bool disableDecPoint = false;
bool cekaniNaKonverzi = false;
float tempC;

void setup()
{
  sensor.begin();
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
               resistorsOnSegments, updateWithDelays, leadingZeros,
               disableDecPoint);
  sevseg.setBrightness(90);
  sensor.setResolution(11);
  sensor.getAddress(deviceAddress, 0);
}

void loop()
{
  currentTime = millis();

  if (!cekaniNaKonverzi && (currentTime - previousTime) >= eventInterval) {
    previousTime = currentTime;
    // nastavit neblokující volání
    sensor.setWaitForConversion(false);
    // následující volání skončí hned bez čekání a konverze bude probíhat na pozadí
    // na dokončení konverze se bude čekat bez blokování viz níže
    sensor.requestTemperatures();
    // nastavit příznak neblokujícího čekání na dokončení konverze dat senzoru na pozadí
    cekaniNaKonverzi = true;
  };

  if (cekaniNaKonverzi) {
    // neblokující dotaz zda konverze dat na pozadí již byla dokončena
    if (sensor.isConversionComplete()) {
      // konverze dat dokončena
      cekaniNaKonverzi = false;
      // teprve nyní načíst a zobrazit data
      // a to by již mělo být rychlé bez bliknutí
      tempC = sensor.getTempC(deviceAddress);
      sevseg.setNumberF(tempC, 1);
    };
  };

  sevseg.refreshDisplay();
}
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#43 Příspěvek od buchar »

Kód jsem nahrál, ale bohužel displej pořád mrká. Tím "mrká" myslím to, že neblikne, ale mrkne aniž by úplně pohasl. Je to stejné jako u vašeho prvního kódu, který jste mi napsal.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#44 Příspěvek od Valdano »

Zkuste ještě změřit dobu trvání sensor.getTempC viz úprava níže a napište kolik to bude ukazovat. Mrkat by to mělo stejně, protože se sensor.getTempC bude volat.

Kód: Vybrat vše

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

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
static DeviceAddress deviceAddress;

#include "SevSeg.h"
SevSeg sevseg;

const unsigned long eventInterval = 1000;
unsigned long previousTime = 0;
unsigned long currentTime = 0;
unsigned long dobaTrvani = 0;
byte numDigits = 4;
byte digitPins[] = {A5, A4, A3, A2};
byte segmentPins[] = {2, 13, 6, 4, 3, 12, 7, 5};
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_CATHODE;
bool updateWithDelays = true;
bool leadingZeros = false;
bool disableDecPoint = false;
bool cekaniNaKonverzi = false;
float tempC;

void setup()
{
  sensor.begin();
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins,
               resistorsOnSegments, updateWithDelays, leadingZeros,
               disableDecPoint);
  sevseg.setBrightness(90);
  sensor.setResolution(11);
  sensor.getAddress(deviceAddress, 0);
}

void loop()
{
  currentTime = millis();

  if (!cekaniNaKonverzi && (currentTime - previousTime) >= eventInterval) {
    previousTime = currentTime;
    // nastavit neblokující volání
    sensor.setWaitForConversion(false);
    // následující volání skončí hned bez čekání a konverze bude probíhat na pozadí
    // na dokončení konverze se bude čekat bez blokování viz níže
    sensor.requestTemperatures();
    // nastavit příznak neblokujícího čekání na dokončení konverze dat senzoru na pozadí
    cekaniNaKonverzi = true;
  };

  if (cekaniNaKonverzi) {
    // neblokující dotaz zda konverze dat na pozadí již byla dokončena
    if (sensor.isConversionComplete()) {
      // konverze dat dokončena
      cekaniNaKonverzi = false;
      // teprve nyní načíst a zobrazit data

      // změření doby trvání sensor.getTempC
      currentTime = millis();
      tempC = sensor.getTempC(deviceAddress);
      dobaTrvani = millis() - currentTime;

      // zde namísto výpisu teploty jen výpis doby trvání
      sevseg.setNumber((int32_t)dobaTrvani);
       
      // sevseg.setNumberF(tempC, 1);
    };
  };

  sevseg.refreshDisplay();
}
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#45 Příspěvek od buchar »

Tak na displeji se po 1s s mrknutím střídá 12 a 13.
Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“