Teploměr s DS18b20 a LED display
Moderátor: Moderátoři
-
Cowley
- Příspěvky: 3577
- Registrován: 04 úno 2005, 00:00
-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
Dumitru
- Příspěvky: 256
- Registrován: 11 pro 2015, 00:00
- Bydliště: Slovensko,Bratislava
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
-
pocitujlasku
- Příspěvky: 2765
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
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.
-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
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?
-
Valdano
- Příspěvky: 3224
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
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();
}-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
Valdano
- Příspěvky: 3224
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
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á?
-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
Valdano
- Příspěvky: 3224
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
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();
}-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice
-
Valdano
- Příspěvky: 3224
- Registrován: 01 led 2023, 00:00
- Bydliště: Česká Lípa
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();
}-
buchar
- Příspěvky: 176
- Registrován: 28 říj 2007, 00:00
- Bydliště: Násedlovice