SysBee v1
Dependencies: C027_Support mbed
Fork of App_Pese_Ruche_SYSBEE by
Diff: main.cpp
- Revision:
- 5:d2702cbe5afe
- Parent:
- 4:bee94a4094b6
- Child:
- 6:b69c4870db2c
diff -r bee94a4094b6 -r d2702cbe5afe main.cpp --- a/main.cpp Thu Sep 06 11:16:03 2018 +0000 +++ b/main.cpp Thu Sep 06 14:40:02 2018 +0000 @@ -1,5 +1,6 @@ #include "mbed.h" #include <string.h> +//#include <LowPowerTimeout.h> #include "GPS.h" #include "MDM.h" @@ -10,43 +11,54 @@ #define USERNAME NULL #define PASSWORD NULL - // size of the average buffer (more means more averaged) -#define AVERAGING_SIZE 2000 +#define AVERAGING_SIZE 500 // time between each capture in us -#define AVERAGING_TIME 100 +#define AVERAGING_TIME 500 // time between each mesures in s -#define MEASURE_INTERVAL 5 +#define MEASURE_INTERVAL 5 //(10 * 60) +// time between each averaging in s +#define AVERAGE_INTERVAL 20 //(24 * 60 * 60) +// number of measure before average +#define AVERAGE_COUNT ((int)(AVERAGE_INTERVAL / MEASURE_INTERVAL)) #define SENSOR_OFFSET 6.1f #define SENSOR_FACTOR 39.0f -#define VALUE_SAVE_COUNT 100 - // weight difference needed to send sms #define DIFF_THRESHOLD 0.4f // states of the hive typedef enum E_HIVE_STATE { - FIRST = 0, - HIVE_STATE_COUNT + HIVE_STATE_INIT = 0, + HIVE_STATE_AVERAGE, + HIVE_STATE_MEASURE, + HIVE_STATE_NOTHING_NEW, + HIVE_STATE_HONEY, + HIVE_STATE_PROBLEM, + HIVE_STATE_PROBLEM_SPRING, + HIVE_STATE_MSG } t_hive_state; -t_hive_state current_state = FIRST; +t_hive_state current_state = HIVE_STATE_INIT; // buffer used to create message content char buffer[1024]; -float values[VALUE_SAVE_COUNT]; -int current_value = 0; -int last_value = 0; +float average_values[AVERAGE_COUNT] = {0.0f}; +float last_average = 0; +float current_average = 0; +float current_average_diff = 0; +float current_measure_diff = 0; +unsigned int average_ticks_passed = 0; // analog read of sensor board output AnalogIn sensor(PC_5); // phone number for sms (Cosima DORLAND) -const char phone_number[] = "0783099416"; +//const char phone_number[] = "0783099416"; +const char phone_number[] = "0786074814"; // Serial object for pc communications Serial pc(USBTX, USBRX); @@ -54,18 +66,36 @@ // modem object for sms communications MDMSerial modem; +// sleep utils +Timeout sleep_timout; + +bool awake = true; + // led for test blink DigitalOut led(LED1); - -void blink() +void blink(void) { led.write(1); wait(0.2); led.write(0); } +void wake_up(void) +{ + awake = true; +} + +void power_sleep(float time) +{ + awake = false; + sleep_timout.attach(wake_up, time); + pc.printf("Going to sleep !\n\r"); + while (!awake) sleep(); + pc.printf("Woke up !\n\r"); +} + // send a sms to the phone number void send_message(char msg[]) { @@ -73,23 +103,15 @@ MDMParser::NetStatus netStatus = {}; // log sms sending to pc - pc.printf("\x1b[34m"); - pc.printf("SMS: "); - pc.printf(msg); - pc.printf("\n\r"); - pc.printf("\x1b[0m"); + pc.printf("\x1b[34mSMS: %s\n\r\x1b[0m", msg); while (!modem.checkNetStatus(&netStatus)) { - pc.printf("\x1b[34m"); - pc.printf("MODEM net_status failed...\n\r"); - pc.printf("\x1b[0m"); + pc.printf("\x1b[34mMODEM checkNetStatus failed...\n\r\x1b[0m"); wait(1); } modem.dumpDevStatus(&devStatus); while (!modem.registerNet(&netStatus)) { - pc.printf("\x1b[34m"); - pc.printf("MODEM register_net failed...\n\r"); - pc.printf("\x1b[0m"); + pc.printf("\x1b[34mMODEM registerNet failed...\n\r\x1b[0m"); wait(1); } modem.dumpNetStatus(&netStatus); @@ -124,21 +146,56 @@ void automate() { switch(current_state) { - case FIRST: - values[current_value] = get_averaged_weight(); - pc.printf("Weight is %02.2fkg", values[current_value]); - pc.printf("\n\r"); - if (abs(values[current_value] - values[last_value]) > DIFF_THRESHOLD) - { - sprintf(buffer, "Weight is %02.2fkg, change of %02.2fkg", values[current_value], values[current_value] - values[last_value]); - send_message(buffer); - last_value = current_value; + case HIVE_STATE_INIT: + if (average_ticks_passed == AVERAGE_COUNT) + current_state = HIVE_STATE_AVERAGE; + else + current_state = HIVE_STATE_MEASURE; + power_sleep(MEASURE_INTERVAL); + break; + case HIVE_STATE_MEASURE: + average_values[average_ticks_passed] = get_averaged_weight(); + pc.printf("Weight is %02.2fkg\n\r", average_values[average_ticks_passed]); + // if we are of the first measure use the one at the end of the list (last one) + current_measure_diff = average_ticks_passed == 0 ? average_values[average_ticks_passed] - average_values[AVERAGE_COUNT - 1] : average_values[average_ticks_passed] - average_values[average_ticks_passed - 1]; + if (abs(current_measure_diff) > DIFF_THRESHOLD) + current_state = HIVE_STATE_PROBLEM; + else + current_state = HIVE_STATE_INIT; + average_ticks_passed++; + break; + case HIVE_STATE_AVERAGE: + current_average = 0; + for(int i = 0; i < average_ticks_passed; i++) { + current_average += average_values[i]; } - current_value = (current_value + 1) % VALUE_SAVE_COUNT; + current_average /= average_ticks_passed; + current_average_diff = current_average - last_average; + last_average = current_average; + if (abs(current_average_diff) > DIFF_THRESHOLD) + current_state = HIVE_STATE_HONEY; + else + current_state = HIVE_STATE_NOTHING_NEW; + average_ticks_passed = 0; + break; + case HIVE_STATE_PROBLEM: + sprintf(buffer, "There has been a problem : %0.1fkg of change in %d minutes !", current_measure_diff, MEASURE_INTERVAL / 60); + current_state = HIVE_STATE_MSG; + break; + case HIVE_STATE_HONEY: + sprintf(buffer, "There is more and more honey in the hive ! %0.1fkg of change in %d hours !", current_average_diff, AVERAGE_INTERVAL / 60); + current_state = HIVE_STATE_MSG; + break; + case HIVE_STATE_NOTHING_NEW: + sprintf(buffer, "Everything is fine ! %0.1fkg of change in %d hours !", current_average_diff, AVERAGE_INTERVAL / 60); + current_state = HIVE_STATE_MSG; + break; + case HIVE_STATE_MSG: + send_message(buffer); + current_state = HIVE_STATE_INIT; break; default: - sprintf(buffer, "Error..."); - pc.printf(buffer); + pc.printf("Error..."); break; } } @@ -174,12 +231,11 @@ // main loop while(1) { // blink once for each measure - blink(); + //blink(); // getting sensor values // acquisition(); // changing state of automata according to read values automate(); - wait(MEASURE_INTERVAL); } }