Arduino och DS18S20
Postat: 16 januari 2016, 19:25:42
Till alla Er som är mycket bättre på Arduino och C än mig.
Jag håller på att bygga en väderstation med givare som jag själv har fräs och svarvat.
Jag kan i dagsläget mäta av vindriktning, vindhastighet, temperatur, regnmängd, luftfuktighet, ljusstyrka och lufttryck. Har planer även på att läsa av åska.
Har fått det mesta att fungera men har just nu problem med temperaturen.
Värdena stämmer tills jag går under 0 grader, då hoppar den 4096 grader. Blir inga minusgrader.
Någon som kan hjälpa mig med vad jag har gjort för fel.
En hel del kod är "stulen" och lite knappande själv.
Jag har försökt att plocka ut de bitar som har med temperaturen att göra i stället för att skicka med all kod till väderstationen, som börjar bli lite lång nu.
DS18S20 är kopplad med separat +, jord och data. Ingen parasit här inte.
Var har jag gjort fel??
Jag håller på att bygga en väderstation med givare som jag själv har fräs och svarvat.
Jag kan i dagsläget mäta av vindriktning, vindhastighet, temperatur, regnmängd, luftfuktighet, ljusstyrka och lufttryck. Har planer även på att läsa av åska.
Har fått det mesta att fungera men har just nu problem med temperaturen.
Värdena stämmer tills jag går under 0 grader, då hoppar den 4096 grader. Blir inga minusgrader.
Någon som kan hjälpa mig med vad jag har gjort för fel.
En hel del kod är "stulen" och lite knappande själv.
Jag har försökt att plocka ut de bitar som har med temperaturen att göra i stället för att skicka med all kod till väderstationen, som börjar bli lite lång nu.
DS18S20 är kopplad med separat +, jord och data. Ingen parasit här inte.
Var har jag gjort fel??
Kod: Markera allt
// Variabel för att hålla temperaturen. Sätts bland alla globala variabler
float tempC = 0;
// Anropas var 10 sekund ifrån "Loop"
tempC = readTemperature(); // temperatur från DS18S20
// Denna skickas ut till en RS422 anslutning för vidare avläsning i datorn en gång per minut
Serial.print(tempC, 2);
// Rutin för att läsa av tempen
// Stulen kod
float readTemperature()
{
byte present = 0;
byte data[12];
float celsius;
char buffer[10];
int i;
oneWire.reset();
oneWire.select(addr);
oneWire.write(0x44);
delay(750); // maybe 750ms is enough, maybe not
present = oneWire.reset();
oneWire.select(addr);
oneWire.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) // we need 9 bytes
{
data[i] = oneWire.read();
}
// convert the data to actual temperature
unsigned int raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
return (celsius);
}