Teploměr s DS18b20 a LED display

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#46 Příspěvek od Valdano »

Tak ještě zkuste hodnotu updateWithDelays změnit na false viz úprava níže a pokud ani to nepomůže tak už to zřejmě lepší nebude a v takovém případě si hodnotu eventInterval zvyšte na 5000 nebo 10000 a načítání bude probíhat jen jednou za 5 nebo 10 sekund i s tím bliknutím. Případně ještě můžete zkusit snížit rozlišení sensor.setResolution(9) jestli to bude mít nějaký vliv na to mrkání.

Pokud jde o ty odchylky teploty o 2°C. Nejprve jste psal, že starý teploměr co jste dělal cca před dvěma lety ukazuje teplotu o 2°C vyšší a pak jste psal, že s ATmega8 ten příklad ukazuje teplotu o 2°C nižší zatímco s ATmega168 ukazuje správně. To jsou tedy tři varianty a každá z nich zobrazuje teplotu jinak. U tohoto vážně nevím v čem je problém.

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 = false;
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(9);
  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
      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

#47 Příspěvek od buchar »

Tak to asi lepší nebude. Chová se to stejně jestli je v updateWithDelays true nebo false.
A co se týká toho dvou stupňového rozdílu mezi A8 a A168, nebylo to myšleno tak ,že A168 ukazuje správnou teplotu a A8 špatnou, o 2°C nižší. Je to jen rozdíl v zobrazené teplotě na displeji při stejném kódu, který byl nahrán do A8 a A168. Který ukazuje správnou teplotu, to teprve zjistím. Teď jsme řešili hlavně to mrkání. Ale jak se ukazuje, nemá to řešení.
Přesto vám Valdano moc děkuji za váš čas a snahu vyřešit můj problém.
PS: Chtěl bych mít vaše znalosti.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#48 Příspěvek od Valdano »

buchar píše:Tak to asi lepší nebude. Chová se to stejně jestli je v updateWithDelays true nebo false.

A mrká to i když se použije sensor.setResolution(9) namísto sensor.setResolution(11)?
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#49 Příspěvek od buchar »

Ano mrká to i při sensor.setResolution(9) i (10) úplně stejně. Ale je i zajímavé, že když jsem nedávno dělal tento teploměr https://www.youtube.com/watch?v=ZvlMptNAw9A&list=PL86H7PGdidG1YxqHJvlHy_KH0ELEokHL7&index=12 a nahrál jsem kód z počítače, tak mi displej blikal a když jsem nahrál kód z notebooku tak už jen jemně mrkal jako to mrká teď. Autorce to neblikalo a použil jsem stejné verze knihoven jako ona. Asi je něco mezi nebem a zemí.
Uživatelský avatar
Cowley
Příspěvky: 3557
Registrován: 04 úno 2005, 00:00

#50 Příspěvek od Cowley »

Jelikož si displej obsluhuje TM1637 sám, bude to s ním rozhodně lepší než multiplex přímo z Arduina.
EDIT: mezitím Valdano smazal odkaz na 4-místný displej s řadičem TM1637.
Naposledy upravil(a) Cowley dne 21 dub 2024, 18:00, celkem upraveno 1 x.
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#51 Příspěvek od buchar »

Tento displej jsem už použil. Dělal jsem teď kukačky na ESP32 s časem z NTP. S SD karty vložené do DFPlayeru to kuká celou hodinu a gong oznamuje čtvrthodiny.
EDIT: Ano všimnul jsem si smazání.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#52 Příspěvek od Valdano »

Omlouvám se. Ten displej co jsem smáznul byl pro hodiny. Pro hodnoty jako je teplota je vhodnější spíš tento 4místný segmentový displej I2C a tady je k tomu příklad. S tím by to mrkat nemělo.
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#53 Příspěvek od buchar »

To je v pohodě, vím co jste tím chtěl říct. Možná ho vyzkouším.
Uživatelský avatar
Celeron
Příspěvky: 20508
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#54 Příspěvek od Celeron »

Asi by ti pomohlo dělat ovládání displeje v přerušení od časovače. Já měl podobnej problém s piezopískačem, když jsem ho ovládal ve smyčce loop, tak cvrdlikal. Převedení na přerušení to vyřešilo.
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#55 Příspěvek od buchar »

Díky za typ Celeron, ale já nejsem zběhlý v programování. Proto jsem tady žádal o pomoc.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#56 Příspěvek od Valdano »

Ani to nedoporučuji, protože ta knihovna SevSeg není na použití s přerušením vůbec stavěná. Je o tom zmínka tady. Psát kvůli tomu vlastní knihovnu je zbytečné když lze koupit celkem levně ten I2C displej, který to řeší.
Naposledy upravil(a) Valdano dne 21 dub 2024, 18:43, celkem upraveno 1 x.
Uživatelský avatar
Celeron
Příspěvky: 20508
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#57 Příspěvek od Celeron »

Valdano píše:Ani to nedoporučuji, protože ta knihovna SevSeg není na použití s přerušením vůbec stavěná. Je o tom zmínka tady.

Na co knihovna na tak jednoduchou věc jako je změna stavu portů? :roll:
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
buchar
Příspěvky: 173
Registrován: 28 říj 2007, 00:00
Bydliště: Násedlovice

#58 Příspěvek od buchar »

Takže nedoporučujete knihovnu "SevSeg" na tyto konstrukce vůbec používat. Takže budu muset poslepovat nějaký jiný kód pro moje teploměry.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#59 Příspěvek od Valdano »

Celeron píše:Na co knihovna na tak jednoduchou věc jako je změna stavu portů? :roll:

SevSeg nemůže použít s přerušením viz už uvedený odkaz a bez toho by si musel napsat vlastní obsluhu těch segmentů, ale klidně sem šoupněte kód, který to vyřeší a je hotovo. :wink:
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#60 Příspěvek od Valdano »

buchar píše:Takže nedoporučujete knihovnu "SevSeg" na tyto konstrukce vůbec používat. Takže budu muset poslepovat nějaký jiný kód pro moje teploměry.

Dle mého názoru bude řešení s přerušením problematické a já osobně bych do toho nešel. Pokud nechcete číst data tak často a mrknutí třeba jednou za 5 nebo 10s vám nebude vadit tak to neřešte a "SevSeg" vám bude stačit s tím, že prostě jen natáhnete interval toho čtení teploty a občasné mrknutí zkrátka pominete. Pokud se chcete toho mrknutí zbavit jděte do toho displeje s I2C.
Odpovědět

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