Hi all,
I'm new to the Arduino (and reasonably new to "proper" programming as well!) and I've run into an issue with attachInterrupt which I'm sure is purely down to my lack of knowledge!
I have a Dallas DS18S20 and I am trying to put together a device which performs an action based on when the temperature changes.
The issue I have run into is that I need to have constant polling of other devices occurring at the same time, so I thought that attachInterrupt would work
The DS18S20 is wired in the usual way (4.7K pull-up resistor, pin 2 on sensor -> pin2 on arduino (or seeeduino in my case)) and my current code is as follows:
#include <OneWire.h>
OneWire ds(2);
void setup(void){
Serial.begin(9600);
attachInterrupt(0,readTemp, CHANGE);
}
void readTemp(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
// 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
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.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;
Serial.println(celsius);
}
void loop(void){
}
As you can see, this is basically the "dallas temperature" example that comes with the OneWire library, however I think I'm "doing it wrong" when it comes to configuring the interrupts.
Any help that can be provided (especially links to further reading etc.) are more than welcome.
Kind regards,
Prof