Založen: Oct 30, 2006 Příspěvky: 2310 Bydliště: Poblíž Zlína
Zaslal: po prosinec 28 2020, 12:47 Předmět: DS18B20 měření záporných hodnot
Mám knihovnu DS18B20 DallasTemperature pro arduino - ESP8266 bohužel nevím jaká je to verze a mám problémy s měřeným záporných hodnot potřeboval bych knihovnu která měří i záporné hodnoty díky
edit: našel jsem verzi 2.1 (na sto procent nevím jestli je ta konkrétní knihovna)
a funkce které jsou využity
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
Zkus se podívat přímo do toho souboru .h případně do .cpp zda tam není popis, jak se funkce používá.
Takhle od pohledu by to mohlo být float getTempC(const uint8_t*)
EU měří v C
Amerika měří v F
Založen: Nov 20, 2012 Příspěvky: 1453 Bydliště: Praha
Zaslal: út prosinec 29 2020, 15:50 Předmět:
Bohužel v hodně knihovnách povalujících se po internetu je chybně zpracováno čtení záporného čísla. Data teploty jsou vždy v °C a jsou uložena jako 16bitové komplementární číslo. Přepočet na °F se dělá až softwarově.
bit0 je 2^-4, bit10 2^5, bit11 až bit15 je znaménkový (sign). Pro 12bitové rozlišení jsou platné všechny, pro 11bitové není bit0 definován, pro 10bitové rozlišení nejsou definovány bity 0 a 1, pro 9bitové pak bity 0,1 a 2.
Je potřeba se podívat, jak je udělán přepočet na float.
getTempCByIndex vrací přečtenou teplotu z čidla dle indexu, getTempC pak z čidla, kde jako vstupní parametr je pointer na 8bytovou adresu čidla.
Založen: Oct 30, 2006 Příspěvky: 2310 Bydliště: Poblíž Zlína
Zaslal: st prosinec 30 2020, 11:14 Předmět:
Já jsem měl projekt který na LCD alfanumerický displej 2x16 znaků, zelený ukazoval teplotu i mínusovou já ho mám i někde v kompu ale nevím kde a na jaké platformě Atmega 8 nebo Pic do nedávna jsem to měl ještě na nepájivém poli ale takových desek není nikdy dost tak jsem to zrušil
edit: tak bylo to na PIC16F628A a ještě v asembleru tak mi to stejně nic neřekne
citace:
Je potřeba se podívat, jak je udělán přepočet na float.
Kde to hledat ?v které části? díky
toto asi nebude ono ?
char charVal[12];
// Konverze vyčtené teploty do stringu
// (hodnota, počet míst, počet desetinných míst,
// umístění stringu)
dtostrf(temp, 8, 2, charVal);
Naposledy upravil markoni dne st prosinec 30 2020, 11:45, celkově upraveno 1 krát.
No prave, budes to lepit tyden z nejakych sracek postahovanych kdovikde, z nicz vetsina vznikla podobnym zpusobem jakym to delas ty. Vysledkem bude polofunkcni bastl bez dokumentace kde jakekoliv zmeny budou problem.
Kdyby sis to napsal sam, mas to za chvilku hotove a vis ze tam nejsou zadne ojeby.
Založen: Oct 30, 2006 Příspěvky: 2310 Bydliště: Poblíž Zlína
Zaslal: st prosinec 30 2020, 12:19 Předmět:
bdn napsal(a):
Zkus se podívat přímo do toho souboru .h případně do .cpp zda tam není popis, jak se funkce používá.
Takhle od pohledu by to mohlo být float getTempC(const uint8_t*)
EU měří v C
Amerika měří v F
#define DALLASTEMPLIBVERSION "3.7.7" // To be deprecated
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
// set to true to include code for new and delete operators
#ifndef REQUIRESNEW
#define REQUIRESNEW false
#endif
// set to true to include code implementing alarm search functions
#ifndef REQUIRESALARMS
#define REQUIRESALARMS true
#endif
#include <inttypes.h>
#include <OneWire.h>
// Model IDs
#define DS18S20MODEL 0x10 // also DS1820
#define DS18B20MODEL 0x28
#define DS1822MODEL 0x22
#define DS1825MODEL 0x3B
// OneWire commands
#define STARTCONVO 0x44 // Tells device to take a temperature reading and put it on the scratchpad
#define COPYSCRATCH 0x48 // Copy EEPROM
#define READSCRATCH 0xBE // Read EEPROM
#define WRITESCRATCH 0x4E // Write to EEPROM
#define RECALLSCRATCH 0xB8 // Reload from last known
#define READPOWERSUPPLY 0xB4 // Determine if device needs parasite power
#define ALARMSEARCH 0xEC // Query bus for devices with an alarm condition
// returns the number of devices found on the bus
uint8_t getDeviceCount(void);
// returns true if address is valid
bool validAddress(const uint8_t*);
// returns true if address is of the family of sensors the lib supports.
bool validFamily(const uint8_t* deviceAddress);
// finds an address at a given index on the bus
bool getAddress(uint8_t*, uint8_t);
// attempt to determine if the device at the given address is connected to the bus
bool isConnected(const uint8_t*);
// attempt to determine if the device at the given address is connected to the bus
// also allows for updating the read scratchpad
bool isConnected(const uint8_t*, uint8_t*);
// read device's power requirements
bool readPowerSupply(const uint8_t*);
// get global resolution
uint8_t getResolution();
// set global resolution to 9, 10, 11, or 12 bits
void setResolution(uint8_t);
// returns the device resolution: 9, 10, 11, or 12 bits
uint8_t getResolution(const uint8_t*);
// set resolution of a device to 9, 10, 11, or 12 bits
bool setResolution(const uint8_t*, uint8_t);
// sets/gets the waitForConversion flag
void setWaitForConversion(bool);
bool getWaitForConversion(void);
// sets/gets the checkForConversion flag
void setCheckForConversion(bool);
bool getCheckForConversion(void);
// sends command for all devices on the bus to perform a temperature conversion
void requestTemperatures(void);
// sends command for one device to perform a temperature conversion by address
bool requestTemperaturesByAddress(const uint8_t*);
// sends command for one device to perform a temperature conversion by index
bool requestTemperaturesByIndex(uint8_t);
// returns temperature raw value (12 bit integer of 1/128 degrees C)
int16_t getTemp(const uint8_t*);
// returns temperature in degrees C
float getTempC(const uint8_t*);
// returns temperature in degrees F
float getTempF(const uint8_t*);
// Get temperature for device index (slow)
float getTempCByIndex(uint8_t);
// Get temperature for device index (slow)
float getTempFByIndex(uint8_t);
// returns true if the bus requires parasite power
bool isParasitePowerMode(void);
bool isConversionAvailable(const uint8_t*);
// Is a conversion complete on the wire?
bool isConversionComplete(void);
#if REQUIRESALARMS
typedef void AlarmHandler(const uint8_t*);
// sets the high alarm temperature for a device
// accepts a char. valid range is -55C - 125C
void setHighAlarmTemp(const uint8_t*, char);
// sets the low alarm temperature for a device
// accepts a char. valid range is -55C - 125C
void setLowAlarmTemp(const uint8_t*, char);
// returns a signed char with the current high alarm temperature for a device
// in the range -55C - 125C
char getHighAlarmTemp(const uint8_t*);
// returns a signed char with the current low alarm temperature for a device
// in the range -55C - 125C
char getLowAlarmTemp(const uint8_t*);
// resets internal variables used for the alarm search
void resetAlarmSearch(void);
// search the wire for devices with active alarms
bool alarmSearch(uint8_t*);
// returns true if ia specific device has an alarm
bool hasAlarm(const uint8_t*);
// returns true if any device is reporting an alarm on the bus
bool hasAlarm(void);
// runs the alarm handler for all devices returned by alarmSearch()
void processAlarms(void);
// sets the alarm handler
void setAlarmHandler(const AlarmHandler *);
// The default alarm handler
static void defaultAlarmHandler(const uint8_t*);
#endif
// if no alarm handler is used the two bytes can be used as user data
// example of such usage is an ID.
// note if device is not connected it will fail writing the data.
// note if address cannot be found no error will be reported.
// in short use carefully
void setUserData(const uint8_t*, int16_t );
void setUserDataByIndex(uint8_t, int16_t );
int16_t getUserData(const uint8_t* );
int16_t getUserDataByIndex(uint8_t );
// convert from Celsius to Fahrenheit
static float toFahrenheit(float);
// convert from Fahrenheit to Celsius
static float toCelsius(float);
// convert from raw to Celsius
static float rawToCelsius(int16_t);
// convert from raw to Fahrenheit
static float rawToFahrenheit(int16_t);
#if REQUIRESNEW
// initialize memory area
void* operator new (unsigned int);
Založen: Oct 30, 2006 Příspěvky: 2310 Bydliště: Poblíž Zlína
Zaslal: so leden 09 2021, 12:28 Předmět:
FHonza napsal(a):
Nech si vypisovat někam návratovou hodnotu funkce
kód:
DallasTemperature::calculateTemperature
Pak hned uvidíš kde je chyba.
Mě jde o to že seto vypisuje na seriáku dobře ale já to posilám na webhosting v podobě GET a něco jestli tady není zakopaný pes třeba v php jazyce znak # nefunguje nebo je na něho pohlíženo jako zvláštní znak a já nemůžu vědět jestli " - " nemá nějaká zvláštní zacházení díky
Založen: Oct 30, 2006 Příspěvky: 2310 Bydliště: Poblíž Zlína
Zaslal: so leden 09 2021, 17:45 Předmět:
To si nechám vypsat, ale teď ukážu tak jak to mám, na tím rámečkem je část kódu která to posílá na api.thingspeak.com tam to funguje i v mínusu podle toho jsem to obšlehl a to mně vykoná PHP skript na mých stránkách díky
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
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
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.