SysBee v1

Dependencies:   C027_Support mbed

Fork of App_Pese_Ruche_SYSBEE by Sysbee

Revision:
5:d2702cbe5afe
Parent:
4:bee94a4094b6
Child:
6:b69c4870db2c
--- 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);
     }
 }