12 #include <BayEOSBufferSPIFlash.h>
15 uint16_t rx1_count, rx1_error;
16 unsigned long rf24_switchon_time, rf24_switchoff_time;
20 uint16_t rx2_count, rx2_error;
25 uint16_t rx3_count, rx3_error;
28 uint8_t tx_res, tx_error;
34 #ifndef BAT_MULTIPLIER
35 #define BAT_MULTIPLIER 3.3 * 200 / 100 / 1023
38 #ifndef TICKS_PER_SECOND
39 #define TICKS_PER_SECOND 16
43 #define SAMPLING_INT 128
47 #define BAUD_RATE 38400
50 #ifndef MIN_VOLTAGE_FULL
51 #define MIN_VOLTAGE_FULL 3.95
55 #define MIN_VOLTAGE 3.75
74 #ifndef EEPROM_BUFFER_STATUS_POS
75 #define EEPROM_BUFFER_STATUS_POS 300
78 #ifndef EEPROM_BUFFER_STATUS_BYTE
79 #define EEPROM_BUFFER_STATUS_BYTE 0xb0
82 volatile uint16_t ticks;
83 volatile uint8_t action;
85 #define ISSET_ACTION(nr) ((1 << nr) & action)
86 #define UNSET_ACTION(nr) (action &= ~(1 << nr))
89 #define ACTION_COUNT 1
92 #ifndef CHECKSUM_FRAMES
93 #define CHECKSUM_FRAMES 0
100 #if TICKS_PER_SECOND > 3
101 #define LED_TICK_DIV (TICKS_PER_SECOND / 4)
103 #define LED_TICK_DIV 1
107 volatile uint8_t action0_pending_count = 0;
110 volatile uint8_t seconds;
111 volatile unsigned long current_micros, last_micros;
112 volatile uint8_t adjust_osccal_flag;
113 volatile uint8_t led_blink = 0;
114 volatile uint8_t led_blink_rx1 = 0;
115 volatile uint8_t led_blink_rx2 = 0;
116 volatile uint8_t led_blink_rx3 = 0;
118 #ifndef SENDING_INTERVAL
119 #define SENDING_INTERVAL 120000L
122 #ifndef NEXT_TRY_INTERVAL
123 #define NEXT_TRY_INTERVAL 300000L
126 #ifndef MAX_BUFFER_AVAILABLE
127 #define MAX_BUFFER_AVAILABLE 2000
133 #ifdef RTC_SECOND_CORRECT
134 volatile long rtc_seconds_correct;
137 #if defined(GPRS_CONFIG)
138 #include <BayTCPSim900.h>
140 #elif defined(SIM800_CONFIG)
141 #include <BaySIM800.h>
144 #elif defined(WLAN_CONFIG)
145 #include <BayTCPESP8266.h>
146 BayESP8266 client(Serial, WLAN_PIN);
147 #elif defined(SERIAL_CLIENT)
149 #include <BayDebug.h>
152 #include <BaySerial.h>
156 #include <BaySerial.h>
169 if (adjust_osccal_flag)
171 last_micros = current_micros;
172 current_micros = micros();
173 adjust_osccal_flag++;
174 if (adjust_osccal_flag > 2)
176 if ((current_micros - last_micros) > (1005000L / TICKS_PER_SECOND))
181 adjust_osccal_flag = 0;
183 else if ((current_micros - last_micros) < (995000L / TICKS_PER_SECOND))
188 adjust_osccal_flag = 0;
193 adjust_osccal_flag = 0;
198 if ((ticks % TICKS_PER_SECOND) == 0)
202 #ifdef RTC_SECOND_CORRECT
204 #if RTC_SECOND_CORRECT < 0
205 rtc_seconds_correct--;
206 if (rtc_seconds_correct <= RTC_SECOND_CORRECT)
208 rtc_seconds_correct = 0;
213 rtc_seconds_correct++;
214 if (rtc_seconds_correct >= RTC_SECOND_CORRECT)
216 rtc_seconds_correct = 0;
223 uint16_t tick_mod = myRTC._seconds % SAMPLING_INT;
224 if (tick_mod < ACTION_COUNT)
230 action0_pending_count++;
233 action0_pending_count = 0;
234 if (action0_pending_count > RESET_COUNT)
235 asm volatile(
" jmp 0");
238 action |= (1 << tick_mod);
246 if ((led_blink > 0) && ((ticks % LED_TICK_DIV) == 0))
248 if (digitalRead(LED_PIN))
250 digitalWrite(LED_PIN, !digitalRead(LED_PIN));
252 if ((led_blink_rx1 > 0) && ((ticks % LED_TICK_DIV) == 0))
254 if (digitalRead(LED_RX1))
256 digitalWrite(LED_RX1, !digitalRead(LED_RX1));
258 #ifdef NRF24_2CHANNEL
259 if ((led_blink_rx2 > 0) && ((ticks % LED_TICK_DIV) == 0))
261 if (digitalRead(LED_RX2))
263 digitalWrite(LED_RX2, !digitalRead(LED_RX2));
266 #ifdef NRF24_3CHANNEL
267 if ((led_blink_rx3 > 0) && ((ticks % LED_TICK_DIV) == 0))
269 if (digitalRead(LED_RX3))
271 digitalWrite(LED_RX3, !digitalRead(LED_RX3));
279 void adjust_OSCCAL(
void)
281 adjust_osccal_flag = 1;
282 while (adjust_osccal_flag)
291 void blinkLED(uint8_t times)
299 Sleep.sleep(TIMER2_ON, SLEEP_MODE_PWR_SAVE);
302 void delayLCB(uint16_t _millis)
304 _millis /= (1000 / TICKS_PER_SECOND);
306 uint16_t end_ticks = ticks + _millis + 2;
311 }
while ((ticks != end_ticks));
319 #if TICKS_PER_SECOND == 128
320 Sleep.setupTimer2(1);
321 #elif TICKS_PER_SECOND == 16
322 Sleep.setupTimer2(2);
323 #elif TICKS_PER_SECOND == 4
324 Sleep.setupTimer2(3);
325 #elif TICKS_PER_SECOND == 2
326 Sleep.setupTimer2(4);
327 #elif TICKS_PER_SECOND == 1
328 Sleep.setupTimer2(5);
330 #error unsupported TICKS_PER_SECOND
333 pinMode(LED_PIN, OUTPUT);
334 pinMode(LED_RX1, OUTPUT);
335 #ifdef NRF24_3CHANNEL
336 pinMode(LED_RX2, OUTPUT);
338 #ifdef NRF24_3CHANNEL
339 pinMode(LED_RX3, OUTPUT);
342 myBuffer.
init(flash);
343 myBuffer.
setRTC(myRTC, RTC_RELATIVE_SECONDS);
344 #ifndef SIM800_CONFIG
349 pinMode(POWER_PIN, OUTPUT);
350 digitalWrite(POWER_PIN, HIGH);
351 #if defined(GPRS_CONFIG)
352 client.readConfigFromStringPGM(PSTR(GPRS_CONFIG));
353 #elif defined(SIM800_CONFIG)
354 client.readConfigFromStringPGM(PSTR(SIM800_CONFIG));
355 #elif defined(WLAN_CONFIG)
356 client.readConfigFromStringPGM(PSTR(WLAN_CONFIG));
357 #elif defined(SERIAL_CLIENT)
359 client.begin(38400, 1);
366 while (client.isReady())
372 while (uint8_t res = client.setConfig(ROUTER_NAME, BaySerialESP_NAME))
374 if (res == 10 + strlen(ROUTER_NAME))
377 delay(res * 500 + 2000);
381 while (uint8_t res = client.setConfig(GATEWAY_IP, BaySerialESP_GATEWAY))
383 if (res == 10 + strlen(GATEWAY_IP))
386 delay(res * 500 + 2000);
390 while (uint8_t res = client.setConfig(GATEWAY_USER, BaySerialESP_USER))
392 if (res == 10 + strlen(GATEWAY_USER))
395 delay(res * 500 + 2000);
399 while (uint8_t res = client.setConfig(GATEWAY_PW, BaySerialESP_PW))
401 if (res == 10 + strlen(GATEWAY_PW))
404 delay(res * 500 + 2000);
412 #if defined(GPRS_CONFIG) || defined(SIM800_CONFIG)
414 tx_res = client.begin(38400);
415 #if defined(SIM800_CONFIG)
418 unsigned long time = client.now().get();
419 if (time > 3600L * 24 * 365 * 20)
427 if (EEPROM.read(EEPROM_BUFFER_STATUS_POS) != EEPROM_BUFFER_STATUS_BYTE)
430 EEPROM.write(EEPROM_BUFFER_STATUS_POS, EEPROM_BUFFER_STATUS_BYTE);
434 myRTC.adjust(client.now());
436 #elif defined(WLAN_CONFIG)
437 tx_res = client.begin(38400);
438 #elif defined(SERIAL_CLIENT)
445 #ifndef SERIAL_CLIENT
446 blinkLED(tx_res + 1);
460 tx_res = client.sendMultiFromBuffer();
461 blinkLED(tx_res + 1);
462 delay(1000 + tx_res * 500);
474 rf24_switchon_time = myRTC.get() + 1;
475 rf24_switchoff_time = myRTC.get();
482 radio.setChannel(NRF24_CHANNEL);
483 radio.setPayloadSize(32);
484 radio.enableDynamicPayloads();
485 radio.setCRCLength(RF24_CRC_16);
486 radio.setDataRate(RF24_250KBPS);
487 radio.setPALevel(RF24_PA_MAX);
488 radio.setRetries(15, 15);
489 radio.setAutoAck(
true);
490 radio.openReadingPipe(0, pipe_0);
491 radio.openReadingPipe(1, pipe_1);
492 radio.openReadingPipe(2, pipe_2);
493 radio.openReadingPipe(3, pipe_3);
494 radio.openReadingPipe(4, pipe_4);
495 radio.openReadingPipe(5, pipe_5);
497 radio.startListening();
498 #ifdef NRF24_2CHANNEL
501 radio2.setChannel(NRF24_2CHANNEL);
502 radio2.setPayloadSize(32);
503 radio2.enableDynamicPayloads();
504 radio2.setCRCLength(RF24_CRC_16);
505 radio2.setDataRate(RF24_250KBPS);
506 radio2.setPALevel(RF24_PA_MAX);
507 radio2.setRetries(15, 15);
508 radio2.setAutoAck(
true);
509 radio2.openReadingPipe(0, pipe_0);
510 radio2.openReadingPipe(1, pipe_1);
511 radio2.openReadingPipe(2, pipe_2);
512 radio2.openReadingPipe(3, pipe_3);
513 radio2.openReadingPipe(4, pipe_4);
514 radio2.openReadingPipe(5, pipe_5);
515 radio2.startListening();
517 #ifdef NRF24_3CHANNEL
520 radio3.setChannel(NRF24_3CHANNEL);
521 radio3.setPayloadSize(32);
522 radio3.enableDynamicPayloads();
523 radio3.setCRCLength(RF24_CRC_16);
524 radio3.setDataRate(RF24_250KBPS);
525 radio3.setPALevel(RF24_PA_MAX);
526 radio3.setRetries(15, 15);
527 radio3.setAutoAck(
true);
528 radio3.openReadingPipe(0, pipe_0);
529 radio3.openReadingPipe(1, pipe_1);
530 radio3.openReadingPipe(2, pipe_2);
531 radio3.openReadingPipe(3, pipe_3);
532 radio3.openReadingPipe(4, pipe_4);
533 radio3.openReadingPipe(5, pipe_5);
534 radio3.startListening();
539 void powerDownRF24(
void)
542 #ifdef NRF24_2CHANNEL
545 #ifdef NRF24_3CHANNEL
551 uint8_t handleRF24(
void)
555 uint8_t pipe_num, len;
557 char origin[] =
"A0";
558 #ifdef RF24_P1_LETTER
559 origin[0] = RF24_P1_LETTER;
563 while (radio.available(&pipe_num))
566 if (len = radio.getDynamicPayloadSize())
569 origin[1] =
'0' + pipe_num;
573 radio.read(payload, len);
574 for (uint8_t i = 0; i < len; i++)
578 #if WITH_RF24_CHECKSUM
579 if (!client.validateChecksum())
609 #ifdef NRF24_2CHANNEL
611 #ifdef RF24_P2_LETTER
612 origin[0] = RF24_P2_LETTER;
617 while (radio2.available(&pipe_num))
620 if (len = radio2.getDynamicPayloadSize())
623 origin[1] =
'0' + pipe_num;
628 radio2.read(payload, len);
629 for (uint8_t i = 0; i < len; i++)
633 #if WITH_RF24_CHECKSUM
634 if (!client.validateChecksum())
666 #ifdef NRF24_3CHANNEL
668 #ifdef RF24_P3_LETTER
669 origin[0] = RF24_P3_LETTER;
674 while (radio3.available(&pipe_num))
677 if (len = radio3.getDynamicPayloadSize())
680 origin[1] =
'0' + pipe_num;
685 radio3.read(payload, len);
686 for (uint8_t i = 0; i < len; i++)
690 #if WITH_RF24_CHECKSUM
691 if (!client.validateChecksum())
729 void checkAction0(
void)
731 if (!ISSET_ACTION(0))
734 #ifndef SERIAL_CLIENT
735 digitalWrite(POWER_PIN, HIGH);
736 analogReference(DEFAULT);
743 batLCB = BAT_MULTIPLIER * analogRead(A7);
768 #ifdef NRF24_2CHANNEL
774 #ifdef NRF24_3CHANNEL
782 if (!gprs_status && batLCB > 3.9)
789 if (batLCB > MIN_VOLTAGE)
791 if (batLCB < MIN_VOLTAGE_FULL)
793 if (rf24_switchon_time > rf24_switchoff_time)
795 if ((myRTC.get() - rf24_switchon_time) > 3600)
797 rf24_switchoff_time = myRTC.get();
804 if ((myRTC.get() - rf24_switchoff_time) > 5 * 3600)
806 rf24_switchon_time = myRTC.get();
811 else if (!rf24_status)
814 if (rf24_status && !gprs_status)
832 tx_res = client.sendMultiFromBuffer(3000);
837 blinkLED(tx_res + 1);
839 if (tx_error > 5 && (tx_error % 5) == 0)
841 digitalWrite(POWER_PIN, LOW);
843 digitalWrite(POWER_PIN, HIGH);
847 while (!tx_res && myBuffer.
available() && !ISSET_ACTION(0))
850 tx_res = client.sendMultiFromBuffer(3000);
851 blinkLED(tx_res + 1);
852 #if defined(SIM800_CONFIG)
853 unsigned long time = client.now().get();
854 if (time > 3600L * 24 * 365 * 20)
862 digitalWrite(POWER_PIN, LOW);
Definition: BayDebug.h:54
unsigned long available(void)
Definition: BayEOSBuffer.cpp:78
void reset(void)
Definition: BayEOSBuffer.cpp:168
void setRTC(RTC &rtc, uint8_t timeType=RTC_ABSOLUTE_SECONDS)
Definition: BayEOSBuffer.cpp:258
void skip(void)
Definition: BayEOSBuffer.cpp:173
Definition: BayEOSBufferSPIFlash.h:6
void init(SPIFlash &flash, uint8_t flush_skip=20)
Definition: BayEOSBufferSPIFlash.cpp:7
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 writeToBuffer(void)
Definition: BayEOS.cpp:322
uint8_t sendMessage(const char *s)
Definition: BayEOS.cpp:295
void startFrame(void)
Definition: BayEOS.cpp:8
void startOriginFrame(const char *o, uint8_t routed=0)
Definition: BayEOS.cpp:20
uint8_t addToPayload(uint8_t b)
Definition: BayEOS.h:469
void startDataFrame(uint8_t subtype=BayEOS_Float32le, uint8_t checksum=0)
Definition: BayEOS.cpp:12
uint8_t sendOrBuffer(void)
Definition: BayEOS.cpp:369
Definition: BayTCPSim900.h:144
Definition: BaySIM800.h:16
Definition: BaySerial.h:135
Definition: BaySerial.h:106
Definition: SPIFlash.h:32