Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Teploměr s DS18b20 a LED display
Jdi na stránku Předchozí  1, 2, 3, 4, 5  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Cowley



Založen: Feb 04, 2005
Příspěvky: 3295

PříspěvekZaslal: so duben 20 2024, 13:16    Předmět: Citovat

A mě ještě neodpověděl, co mu to vypisuje v Serial Monitoru?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: so duben 20 2024, 13:18    Předmět: Citovat

Zatím jsem nahrál nový kód jen do jednoho teploměru, ale všechny jsou úplně stejné.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: so duben 20 2024, 13:21    Předmět: Citovat

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é.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Dumitru



Založen: Dec 11, 2015
Příspěvky: 139
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: so duben 20 2024, 13:36    Předmět: Citovat

buchar napsal(a):
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 Smile ak to nevyrieši niekto skôr Wink


Naposledy upravil Dumitru dne so duben 20 2024, 13:41, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
pocitujlasku



Založen: Dec 12, 2005
Příspěvky: 2178

PříspěvekZaslal: so duben 20 2024, 13:38    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: so duben 20 2024, 14:04    Předmět: Citovat

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é.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: ne duben 21 2024, 7:01    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 1708
Bydliště: Česká Lípa

PříspěvekZaslal: ne duben 21 2024, 13:39    Předmět: Citovat

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:
#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 Valdano dne ne duben 21 2024, 14:36, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: ne duben 21 2024, 14:33    Předmět: Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 1708
Bydliště: Česká Lípa

PříspěvekZaslal: ne duben 21 2024, 14:42    Předmět: Citovat

buchar napsal(a):
1. verze knihovny je 3.8.0

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

buchar napsal(a):
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á?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: ne duben 21 2024, 14:51    Předmět: Citovat

Při zakomentování řádku "tempC = sensor.getTempCByIndex(0)" displej nebliká.
Knihovnu hned aktualizuji.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 1708
Bydliště: Česká Lípa

PříspěvekZaslal: ne duben 21 2024, 15:02    Předmět: Citovat

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

kód:
#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();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: ne duben 21 2024, 15:14    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 1708
Bydliště: Česká Lípa

PříspěvekZaslal: ne duben 21 2024, 15:26    Předmět: Citovat

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:
#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();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
buchar



Založen: Oct 28, 2007
Příspěvky: 88
Bydliště: Násedlovice

PříspěvekZaslal: ne duben 21 2024, 15:32    Předmět: Citovat

Tak na displeji se po 1s s mrknutím střídá 12 a 13.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4, 5  Další
Strana 3 z 5

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.14 sekund