BayEOSArduino Library
RF24Taster.h
1 #include <BayEOSCommands.h>
2 #include <BayEOSBufferRAM.h>
3 #include <BayRF24.h>
4 //#define RF24ADDRESS2 0x7616a24748LL /*via forward*/
5 
6 #ifndef TASTER_VERSION
7 #define TASTER_VERSION 2
8 #endif
9 
10 #ifndef WITHBUFFER
11 #define WITHBUFFER 1
12 #endif
13 
14 #if TASTER_VERSION == 2
15 #define TOPLEFT 3
16 #define TOPRIGHT 2
17 #define BOTTOMLEFT 0
18 #define BOTTOMRIGHT 1
19 #else
20 #define TOPLEFT 1
21 #define TOPRIGHT 2
22 #define BOTTOMLEFT 0
23 #define BOTTOMRIGHT 3
24 #endif
25 
26 
27 BayRF24 client = BayRF24(9, 10);
28 unsigned long last_status;
29 
30 #if WITHBUFFER
31 #ifdef __AVR_ATmega168P__
32 uint8_t buffer[100];
33 #else
34 uint8_t buffer[1000];
35 #endif
36 
37 BayEOSBufferRAM myBuffer(buffer);
38 #endif
39 
40 
41 void longPressHandler(uint8_t nr);
42 void shortPressHandler(uint8_t nr);
43 
44 #define SAMPLING_INT 300
45 #define TICKS_PER_SECOND 1
46 #define ACTION_COUNT 1
47 #include <LowCurrentBoard.h>
48 
49 #if WITH_NTC
50 #include <NTC.h>
51 NTC_ADC ntc(A2, A1, 20000.0, 10.0);
52 #if WITH_HR202
53 #include <HR202.h>
54 HR202 hr(A5, A4, A3);
55 #endif
56 #endif
57 
58 void pciSetup(byte pin) {
59  *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
60  PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
61  PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
62 }
63 
64 void sendCommand(uint8_t command, uint8_t channel = 0x01, uint8_t arg = 0) {
65  client.startFrame(BayEOS_ChecksumFrame);
66  client.addToPayload((uint8_t)BayEOS_Command);
67  client.addToPayload((uint8_t)BayEOS_SwitchCommand);
68  client.addToPayload(command);
69  client.addToPayload(channel);
70  client.addToPayload(arg);
71  client.addChecksum();
72 #if BLINK_ON_SEND
73  if (client.sendPayload()) blinkLED(2);
74  else blinkLED(1);
75 #else
76  client.sendPayload();
77 #endif
78 
79 }
80 
81 
82 uint8_t pins[] = {2, 3, 6, 7};
83 
84 volatile uint8_t int_flag;
85 void isr_int0(void) {
86  if (! int_flag) int_flag = 0x1;
87 }
88 
89 void isr_int1(void) {
90  if (! int_flag) int_flag = 0x2;
91 }
92 
93 ISR (PCINT2_vect) {
94  if (int_flag) return;
95  if (! digitalRead(6)) {
96  int_flag = 0x3;
97  return;
98  }
99  if (! digitalRead(7)) {
100  int_flag = 0x4;
101  }
102 }
103 uint16_t last_int;
104 
105 void initBoard(void) {
106  uint8_t temp = MCUCR;
107  MCUCR = temp | (1 << IVCE);
108  MCUCR = temp & ~(1 << IVSEL);
109  initLCB();
110  client.init(RF24ADDRESS, RF24CHANNEL);
111 #if WITHBUFFER
112  myBuffer.setRTC(myRTC, 0); //relative Time
113  client.setBuffer(myBuffer, 20);
114 #endif
115  for (uint8_t i = 0; i < 4; i++) {
116  pinMode(pins[i], INPUT_PULLUP);
117  }
118  pciSetup(6);
119  pciSetup(7);
120  attachInterrupt(digitalPinToInterrupt(2), isr_int0, FALLING);
121  attachInterrupt(digitalPinToInterrupt(3), isr_int1, FALLING);
122  startLCB();
123  int_flag = 0;
124 }
125 
126 uint8_t command = 0, channel = 0, int_pin;
127 uint8_t fast_ticks = 0;
128 
129 void handlePushButton(void) {
130  if (int_flag) {
131  int_pin = (int_flag & 0xf) - 1;
132  if (int_flag & 0x10) {
133  if (! (int_flag & 0x20) && ! digitalRead(pins[int_pin]) && (ticks - last_int) > 6) {
134  bitSet(int_flag, 5); //set bit 6 (long press)
135  bitClear(int_flag, 6); //clear bit 7 (command send)
136  }
137  if (digitalRead(pins[int_pin]) && (ticks - last_int) > 1) {
138  Sleep.setupTimer2(5); //1 ticks per s
139  int_flag = 0; //clear flag
140  }
141  } else {
142  last_int = ticks;
143  Sleep.setupTimer2(2);//16 ticks/s
144  bitSet(int_flag, 4); //set bit 5 (int registered)
145  }
146  }
147  if (int_flag) {
148  if (! (int_flag & 0x40)) {
149  bitSet(int_flag, 6);
150  // channel = (int_pin < 2 ? 1 : 2);
151  uint8_t arg=0;
152  if (int_flag & 0x20) { //long press
153  longPressHandler(int_pin);
154  //(*handleLongPressCommand)(int_pin);
155  } else { //short press
156  shortPressHandler(int_pin);
157  //(*handleShortPressCommand)(int_pin);
158  }
159  client.setTXAddr(RF24ADDRESS);
160  delay(300);
161 
162  }
163  }
164 }
165 
166 void sendStatus(void){
167 #if STATUS_SEND
168  if (ISSET_ACTION(0)) {
169  UNSET_ACTION(0);
170  client.startDataFrameWithOrigin(BayEOS_Int16le, STATUS_NAME, 1);
171  pinMode(A0, OUTPUT);
172  digitalWrite(A0, HIGH);
173  analogReference(INTERNAL);
174  int adc = analogRead(A7);
175  digitalWrite(A0, LOW);
176  pinMode(A0, INPUT);
177  client.addChannelValue( 1.1 * 320 / 100 / 1023 * 1000 * adc);
178  analogReference(DEFAULT);
179  client.addChannelValue((float)(millis()-last_status)*10/SAMPLING_INT);
180  last_status=millis();
181 #if WITH_NTC
182  float t = ntc.getTemp();
183  client.addChannelValue(100 * t);
184 #if WITH_HR202
185  float h = hr.getHumidity(t);
186  client.addChannelValue(100 * h);
187 #endif
188 #endif
189  client.addChecksum();
190 #if WITHBUFFER
191  client.sendOrBuffer();
192 #else
193  client.sendPayload();
194 #endif
195  }
196 #if WITHBUFFER
197  if (ISSET_ACTION(7)) {
198  UNSET_ACTION(7);
199  client.sendFromBuffer();
200  }
201 #endif
202 #endif
203 }
void setRTC(RTC &rtc, uint8_t timeType=RTC_ABSOLUTE_SECONDS)
Definition: BayEOSBuffer.cpp:258
Definition: BayEOSBufferRAM.h:13
void startDataFrameWithOrigin(uint8_t subtype, const char *o, uint8_t checksum=0, uint8_t routed=0)
Definition: BayEOS.cpp:27
void setBuffer(BayEOSBuffer &buffer, uint16_t max_skip=0)
Definition: BayEOS.h:452
uint8_t addChannelValue(float v, uint8_t channel_number=0)
Definition: BayEOS.cpp:61
uint8_t sendFromBuffer(void)
Definition: BayEOS.cpp:394
void startFrame(void)
Definition: BayEOS.cpp:8
uint8_t addToPayload(uint8_t b)
Definition: BayEOS.h:469
uint8_t sendOrBuffer(void)
Definition: BayEOS.cpp:369
Definition: BayRF24.h:7
uint8_t sendPayload(void)
Definition: BayRF24.cpp:15
Definition: HR202.h:12
Definition: NTC.h:26