11 #include <BayEOSBufferSPIFlash.h>
12 #include <BaySerial.h>
14 uint16_t rx1_count, rx1_error;
21 uint16_t rx2_count, rx2_error;
26 uint8_t tx_res, tx_error;
31 #ifndef BAT_MULTIPLIER
32 #define BAT_MULTIPLIER 3.3*200/100/1023
35 #ifndef TICKS_PER_SECOND
36 #define TICKS_PER_SECOND 16
40 #define SAMPLING_INT 128
44 #define BAUD_RATE 38400
52 volatile uint16_t ticks;
53 volatile uint8_t action;
56 #define ISSET_ACTION(nr) ((1<<nr)&action)
57 #define UNSET_ACTION(nr) (action&= ~(1<<nr))
60 #define ACTION_COUNT 1
65 #ifndef CHECKSUM_FRAMES
66 #define CHECKSUM_FRAMES 0
74 #if TICKS_PER_SECOND>3
75 #define LED_TICK_DIV (TICKS_PER_SECOND/4)
77 #define LED_TICK_DIV 1
82 volatile uint8_t action0_pending_count=0;
85 volatile uint8_t seconds;
86 volatile unsigned long current_micros, last_micros;
87 volatile uint8_t adjust_osccal_flag;
88 volatile uint8_t led_blink = 0;
89 volatile uint8_t led_blink_rx1 = 0;
90 volatile uint8_t led_blink_rx2 = 0;
91 volatile uint8_t led_blink_rx3 = 0;
93 #ifndef SENDING_INTERVAL
94 #define SENDING_INTERVAL 120000L
97 #ifndef NEXT_TRY_INTERVAL
98 #define NEXT_TRY_INTERVAL 300000L
101 #ifndef MAX_BUFFER_AVAILABLE
102 #define MAX_BUFFER_AVAILABLE 2000
108 #ifdef RTC_SECOND_CORRECT
109 volatile long rtc_seconds_correct;
113 #include <BayTCPSim900.h>
117 #include <BayTCPESP8266.h>
118 BayESP8266 client(Serial, POWER_PIN);
120 #include <BayDebug.h>
122 #define DEBUG_CONFIG 1
132 ISR(TIMER2_OVF_vect) {
134 if(adjust_osccal_flag){
135 last_micros=current_micros;
136 current_micros=micros();
137 adjust_osccal_flag++;
138 if(adjust_osccal_flag>2){
139 if((current_micros-last_micros)>(1005000L/TICKS_PER_SECOND)){
141 else adjust_osccal_flag=0;
143 else if((current_micros-last_micros)<(995000L/TICKS_PER_SECOND)){
144 if(OSCCAL<255) OSCCAL++;
145 else adjust_osccal_flag=0;
149 adjust_osccal_flag=0;
156 if((ticks % TICKS_PER_SECOND)==0) {
159 #ifdef RTC_SECOND_CORRECT
161 #if RTC_SECOND_CORRECT < 0
162 rtc_seconds_correct--;
163 if(rtc_seconds_correct<=RTC_SECOND_CORRECT){
164 rtc_seconds_correct=0;
169 rtc_seconds_correct++;
170 if(rtc_seconds_correct>=RTC_SECOND_CORRECT){
171 rtc_seconds_correct=0;
178 uint16_t tick_mod=myRTC._seconds%SAMPLING_INT;
179 if(tick_mod<ACTION_COUNT) {
183 action0_pending_count++;
186 action0_pending_count=0;
187 if(action0_pending_count>RESET_COUNT)
188 asm volatile (
" jmp 0");
192 action|=(1<<tick_mod);
198 if((led_blink>0) && ((ticks%LED_TICK_DIV)==0)) {
199 if(digitalRead(LED_PIN)) led_blink--;
200 digitalWrite(LED_PIN,!digitalRead(LED_PIN));
202 if((led_blink_rx1>0) && ((ticks%LED_TICK_DIV)==0)) {
203 if(digitalRead(LED_RX1)) led_blink_rx1--;
204 digitalWrite(LED_RX1,!digitalRead(LED_RX1));
207 if((led_blink_rx2>0) && ((ticks%LED_TICK_DIV)==0)) {
208 if(digitalRead(LED_RX2)) led_blink_rx2--;
209 digitalWrite(LED_RX2,!digitalRead(LED_RX2));
217 void adjust_OSCCAL(
void){
218 adjust_osccal_flag=1;
219 while(adjust_osccal_flag){
229 void blinkLED(uint8_t times) {
235 Sleep.sleep(TIMER2_ON, SLEEP_MODE_PWR_SAVE);
238 void delayLCB(uint16_t _millis) {
239 _millis /= (1000 / TICKS_PER_SECOND);
241 uint16_t end_ticks = ticks + _millis + 2;
245 }
while ((ticks != end_ticks));
252 #if TICKS_PER_SECOND==128
253 Sleep.setupTimer2(1);
254 #elif TICKS_PER_SECOND==16
255 Sleep.setupTimer2(2);
256 #elif TICKS_PER_SECOND==4
257 Sleep.setupTimer2(3);
258 #elif TICKS_PER_SECOND==2
259 Sleep.setupTimer2(4);
260 #elif TICKS_PER_SECOND==1
261 Sleep.setupTimer2(5);
263 #error unsupported TICKS_PER_SECOND
266 pinMode(TXRX_PIN, OUTPUT);
267 digitalWrite(TXRX_PIN,0);
268 pinMode(CTS_PIN,OUTPUT);
269 digitalWrite(CTS_PIN,0);
271 pinMode(LED_PIN, OUTPUT);
272 pinMode(LED_RX1, OUTPUT);
274 pinMode(LED_RX2, OUTPUT);
277 myBuffer.
init(flash);
279 myBuffer.
setRTC(myRTC, 0);
283 pinMode(POWER_PIN, OUTPUT);
284 digitalWrite(POWER_PIN, HIGH);
288 client.readConfigFromStringPGM(PSTR(GPRS_CONFIG));
289 tx_res = client.begin(38400);
292 client.readConfigFromStringPGM(PSTR(WLAN_CONFIG));
293 tx_res = client.begin(38400);
295 client.begin(38400,1);
300 if (! tx_res) myRTC.adjust(client.now());
302 blinkLED(tx_res + 1);
315 blinkLED(tx_res + 1);
316 delay(1000 + tx_res * 500);
330 void initRF24(
void) {
333 radio.setChannel(NRF24_CHANNEL);
334 radio.setPayloadSize(32);
335 radio.enableDynamicPayloads();
336 radio.setCRCLength(RF24_CRC_16);
337 radio.setDataRate(RF24_250KBPS);
338 radio.setPALevel(RF24_PA_MAX);
339 radio.setRetries(15, 15);
340 radio.setAutoAck(
true);
341 radio.openReadingPipe(0, pipe_0);
342 radio.openReadingPipe(1, pipe_1);
343 radio.openReadingPipe(2, pipe_2);
344 radio.openReadingPipe(3, pipe_3);
345 radio.openReadingPipe(4, pipe_4);
346 radio.openReadingPipe(5, pipe_5);
350 uint8_t handleRF24(
void) {
351 uint8_t pipe_num, len;
353 char origin[] =
"A0";
354 #ifdef RF24_P1_LETTER
355 origin[0]=RF24_P1_LETTER;
359 while (radio.available(&pipe_num)) {
361 if (len = radio.getDynamicPayloadSize()) {
363 origin[1] =
'0' + pipe_num;
367 radio.read(payload, len);
368 for (uint8_t i = 0; i < len; i++) {
371 #if WITH_RF24_CHECKSUM
372 if(! client.validateChecksum()) {
398 void checkAction0(
void){
399 if(! ISSET_ACTION(0))
return;
402 digitalWrite(POWER_PIN, HIGH);
403 digitalWrite(TXRX_PIN,0);
404 pinMode(CTS_PIN,OUTPUT);
405 digitalWrite(CTS_PIN,0);
406 analogReference (DEFAULT);
407 if(! gprs_status) delayLCB(1000);
412 batLCB = BAT_MULTIPLIER * analogRead(A7);
442 if (! gprs_status && batLCB > 3.9) {
461 tx_res = client.sendMultiFromBuffer(1000);
465 if(tx_res) tx_error++;
467 blinkLED(tx_res + 1);
469 if(tx_error>5 && (tx_error % 5)==0){
470 digitalWrite(POWER_PIN, LOW);
472 digitalWrite(POWER_PIN, HIGH);
477 while (! tx_res && myBuffer.
available() && ! ISSET_ACTION(0)) {
483 tx_res = client.sendMultiFromBuffer(1000);
487 blinkLED(tx_res + 1);
490 digitalWrite(POWER_PIN, LOW);
495 digitalWrite(TXRX_PIN,1);
496 pinMode(CTS_PIN,INPUT);
511 myRTC._seconds=SAMPLING_INT-1;
521 }
else if (res == 1) {
Definition: BayDebug.h:54
unsigned long available(void)
Definition: BayEOSBuffer.cpp:78
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 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
uint8_t sendFromBuffer(void)
Definition: BayEOS.cpp:394
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
Definition: BayTCPSim900.h:144
Definition: BaySerial.h:106
uint8_t readIntoPayload(int timeout=0)
Definition: BaySerial.cpp:95
Definition: SPIFlash.h:32