Ich habe den DS18x20 Temperature
Beispiel-Sketch (unverändert, außer ich habe mehrere Pins für die I2C-Kommunikation ausprobiert) auf meine bewährte Duemilanove und meine mighty 1284p
.
Auf dem Duemilanove DS18B20
werden meine beiden Temperatursensoren gefunden und korrekt ausgelesen:
ROM = 28 36 6D 51 4 0 0 75
Chip = DS18B20
Data = 1 D6 1 4B 46 7F FF A 10 43 CRC=43
Temperature = 29.37 Celsius, 84.87 Fahrenheit
ROM = 28 19 6 51 4 0 0 86
Chip = DS18B20
Data = 1 A7 1 4B 46 7F FF 9 10 E0 CRC=E0
Temperature = 26.44 Celsius, 79.59 Fahrenheit
No more addresses.
(...)
Wobei die 1284p nur sagt
No more addresses.
No more addresses.
(...)
Ich habe die Verkabelung der Sensoren nicht verändert; Sie sind mit +5/GND verbunden, Daten werden mit einem 2k7 auf +5V und auch auf den Lesestift gezogen. Ich habe mehrere Pins für die I2C-Kommunikation getestet - sie funktionieren alle auf dem Duemilanove, keiner funktioniert auf dem 1284p.
Ich vermute einige Probleme mit I2C mit mighty 1284p
, aber vielleicht hat jemand anderes eine andere Idee.
Hier ist der Code (die unveränderte Beispielskizze, mir wurde beigebracht, "immer den verwendeten Code einzufügen!", also hier ist er):
#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(0); // on pin 10
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
Serial.print(" Data = ");
Serial.print(present,HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// 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;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
}
Danke schön.
Es stellte sich heraus, dass ich den ATMega1284p mit "nur" 1 MHz laufen ließ. Durch die Sicherung auf 8 MHz funktionierte alles einwandfrei. Stabile Verbindung, zuverlässige Erkennung von Sensoren, keine Datenaussetzer soweit ich das überblicken kann.
mighty1284p
Ich werde versuchen, mit den und Arduino OneWire Library
den Leuten in Kontakt zu treten , um dies zu besprechen. Ich denke, ihr Code geht entweder fest codiert davon aus, dass das Gerät mit 8 MHz läuft, oder wenn es mit 1 MHz läuft, wird die Kommunikation unzuverlässig.
Jippie
Christian
Christian