Teploměr s DS18b20 a LED display
Moderátor: Moderátoři
- Dumitru
- Příspěvky: 254
- Registrován: 11 pro 2015, 00:00
- Bydliště: Slovensko,Bratislava
- Kontaktovat uživatele:
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: 2764
- 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.
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?
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íš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á?
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();
}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();
}