Stránka 3 z 5

Napsal: 20 dub 2024, 14:16
od Cowley
A mě ještě neodpověděl, co mu to vypisuje v Serial Monitoru?

Napsal: 20 dub 2024, 14:18
od buchar
Zatím jsem nahrál nový kód jen do jednoho teploměru, ale všechny jsou úplně stejné.

Napsal: 20 dub 2024, 14:21
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é.

Napsal: 20 dub 2024, 14:36
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 ;)

Napsal: 20 dub 2024, 14:38
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.

Napsal: 20 dub 2024, 15:04
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é.

Napsal: 21 dub 2024, 08:01
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?

Napsal: 21 dub 2024, 14:39
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();
}

Napsal: 21 dub 2024, 15:33
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

Napsal: 21 dub 2024, 15:42
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á?

Napsal: 21 dub 2024, 15:51
od buchar
Při zakomentování řádku "tempC = sensor.getTempCByIndex(0)" displej nebliká.
Knihovnu hned aktualizuji.

Napsal: 21 dub 2024, 16:02
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();
}

Napsal: 21 dub 2024, 16:14
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.

Napsal: 21 dub 2024, 16:26
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();
}

Napsal: 21 dub 2024, 16:32
od buchar
Tak na displeji se po 1s s mrknutím střídá 12 a 13.