// |_________| |______| |___| |
//
// | Sync | 1 | 0 |
-// | 8320us | 4500us | 2530us
+// | 9780us | 4420us | 2410us
+// 9810 4410 2490
// Defines
-#define allDataBits 42 // Number of data bits to expect
+#define DataBits0 4 // Number of data0 bits to expect
+#define DataBits1 32 // Number of data1 bits to expect
+#define allDataBits 36 // Number of data sum 0+1 bits to expect
// isrFlags bit numbers
#define F_HAVE_DATA 1 // 0=Nothing in read buffer, 1=Data in read buffer
#define F_GOOD_DATA 2 // 0=Unverified data, 1=Verified (2 consecutive matching reads)
#define F_CARRY_BIT 3 // Bit used to carry over bit shift from one long to the other
#define F_STATE 7 // 0=Sync mode, 1=Data mode
+#define DEBUG 0
+
+// uno: pin 2 = int.0 or pin 3 = int.1 see
+// http://arduino.cc/en/Reference/attachInterrupt
+#define ISR_PIN 2
+#define ISR_INT 0
+
// Constants
-const unsigned long sync_MIN = 8120; // Minimum Sync time in micro seconds
-const unsigned long sync_MAX = 8520;
-const unsigned long bit1_MIN = 4300;
-const unsigned long bit1_MAX = 4700;
-const unsigned long bit0_MIN = 2330;
-const unsigned long bit0_MAX = 2730;
+const unsigned long sync_MIN = 9600; // Minimum Sync time in micro seconds
+const unsigned long sync_MAX = 9900;
+
+const unsigned long bit1_MIN = 4200;
+const unsigned long bit1_MAX = 4600;
+
+const unsigned long bit0_MIN = 2200;
+const unsigned long bit0_MAX = 2600;
+
const unsigned long glitch_Length = 300; // Anything below this value is a glitch and will be ignored.
// Interrupt variables
volatile unsigned long read_Buffer[] = {0,0}; // Placeholder last full data packet read.
volatile byte isrFlags = 0; // Various flag bits
-void PinChangeISR0(){ // Pin 2 (Interrupt 0) service routine
+void PinChangeISR(){ // Pin 2 (Interrupt 0) service routine
unsigned long Time = micros(); // Get current time
- if (digitalRead(2) == LOW) {
+ if (digitalRead(ISR_PIN) == LOW) {
// Falling edge
if (Time > (rise_Time + glitch_Length)) {
// Not a glitch
void setup() {
-pinMode(13,OUTPUT); // Used for debugging
+ pinMode(13,OUTPUT); // Used for debugging
Serial.begin(9600);
- pinMode(2,INPUT);
- Serial.println(F("ISR Pin 2 Configured For Input."));
- attachInterrupt(0,PinChangeISR0,CHANGE);
- Serial.println(F("Pin 2 ISR Function Attached. Here we go."));
+ pinMode(ISR_PIN,INPUT);
+ attachInterrupt(ISR_INT,PinChangeISR,CHANGE);
+ Serial.print("# Pin ");
+ Serial.print(ISR_PIN);
+ Serial.print(" int ");
+ Serial.print(ISR_INT);
+ Serial.println(" ISR attached");
}
void loop() {
- unsigned long myData0 = 0;
- unsigned long myData1 = 0;
if (bitRead(isrFlags,F_GOOD_DATA) == 1) {
+ serial_dump();
+ delay(100);
+ }
+}
+
+void serial_dump(void) {
+ unsigned long myData0 = 0;
+ unsigned long myData1 = 0;
+
// We have at least 2 consecutive matching reads
- myData0 = read_Buffer[0]; // Read the data spread over 2x 32 variables
- myData1 = read_Buffer[1];
+ myData0 = read_Buffer[0]; // first 4 bits
+ myData1 = read_Buffer[1]; // rest of 32 bits
bitClear(isrFlags,F_HAVE_DATA); // Flag we have read the data
- dec2binLong(myData0,10);
- dec2binLong(myData1,32);
-
- Serial.print(" - Battery=");
- byte H = (myData1 >> 30) & 0x3; // Get Battery
- Serial.print(H);
- Serial.print(" Channel=");
- H = (myData1 >> 28) & 0x3; // Get Channel
- Serial.print(H);
- Serial.print(" Temperature=");
- byte ML = (myData1 >> 16) & 0xF0; // Get MMMM
- H = (myData1 >> 24) & 0xF; // Get LLLL
- ML = ML | H; // OR MMMM & LLLL nibbles together
- H = (myData1 >> 16) & 0xF; // Get HHHH
- int Temperature = (H << 8) | ML; // Combine HHHH MMMMLLLL
- Temperature = Temperature -900; // Remove Constant offset
- Serial.print(Temperature/10.0,1);
- Serial.print("F Humidity=");
- H = (myData1 >> 4) & 0xF0; // Get HHHH
- ML = (myData1 >> 12) & 0xF; // Get LLLL
- ML = ML | H; // OR HHHH & LLLL nibbles together
- Serial.print(ML);
- Serial.println("%");
- }
- delay(100);
+
+if (DEBUG) {
+ Serial.print("# 0=");
+ dec2binLong(myData0,DataBits0);
+ Serial.print(" 1=");
+ dec2binLong(myData1,DataBits1);
+ Serial.println();
+}
+
+ Serial.print("temp=");
+ int temp = ( myData1 >> 8 ) & 0xFFF;
+ if ( temp & 0x800 ) temp = temp | 0xF000;
+ Serial.print(temp / 10.0, 1);
+
+ Serial.print(" humidity=");
+ Serial.print( myData1 & 0xFF );
+
+ byte b1 = ( myData1 >> 20 ); // second byte from received packet
+
+ Serial.print(" button=");
+ Serial.print( b1 & 0x04);
+
+ Serial.print(" battery=");
+ Serial.print( b1 & 0x08);
+
+ Serial.print(" channel=");
+ Serial.print( ( b1 & 0x03 ) + 1 );
+
+ Serial.print(" rid=");
+ Serial.println( myData1 >> 24 );
+
+ // remote but so we don't see this packet again
+ bitClear(isrFlags, F_GOOD_DATA);
+
}
void dec2binLong(unsigned long myNum, byte NumberOfBits) {
else
Serial.print("0");
myNum = myNum << 1;
+ if ( i % 4 == 3 ) Serial.print(" ");
}
}
}
-