SysBee v1
Dependencies: C027_Support mbed
Fork of App_Pese_Ruche_SYSBEE by
main.cpp
- Committer:
- thomaspotier
- Date:
- 2018-09-06
- Revision:
- 4:bee94a4094b6
- Parent:
- 3:8b90a40df4db
- Child:
- 5:d2702cbe5afe
File content as of revision 4:bee94a4094b6:
#include "mbed.h" #include <string.h> #include "GPS.h" #include "MDM.h" // sim pin code #define SIMPIN "1234" #define APN NULL #define USERNAME NULL #define PASSWORD NULL // size of the average buffer (more means more averaged) #define AVERAGING_SIZE 2000 // time between each capture in us #define AVERAGING_TIME 100 // time between each mesures in s #define MEASURE_INTERVAL 5 #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 } t_hive_state; t_hive_state current_state = FIRST; // buffer used to create message content char buffer[1024]; float values[VALUE_SAVE_COUNT]; int current_value = 0; int last_value = 0; // analog read of sensor board output AnalogIn sensor(PC_5); // phone number for sms (Cosima DORLAND) const char phone_number[] = "0783099416"; // Serial object for pc communications Serial pc(USBTX, USBRX); // modem object for sms communications MDMSerial modem; // led for test blink DigitalOut led(LED1); void blink() { led.write(1); wait(0.2); led.write(0); } // send a sms to the phone number void send_message(char msg[]) { MDMParser::DevStatus devStatus = {}; 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"); while (!modem.checkNetStatus(&netStatus)) { pc.printf("\x1b[34m"); pc.printf("MODEM net_status failed...\n\r"); pc.printf("\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"); wait(1); } modem.dumpNetStatus(&netStatus); modem.smsSend(phone_number ,msg); } // return the current calibrated weight float get_weight() { float weight; // weight is the sensor output in volts weight = sensor.read() * 3.3f; // return calibrated result return (weight * SENSOR_FACTOR - SENSOR_OFFSET); } // return an averaged weight (time consuming function) float get_averaged_weight() { float average = 0; int i; for(i = 0; i < AVERAGING_SIZE; i++) { average += get_weight(); wait_us(AVERAGING_TIME); } return (average / AVERAGING_SIZE); } // automata calculations 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; } current_value = (current_value + 1) % VALUE_SAVE_COUNT; break; default: sprintf(buffer, "Error..."); pc.printf(buffer); break; } } void init_modem(void) { MDMParser::DevStatus devStatus = {}; MDMParser::NetStatus netStatus = {}; // retry from begining if something fails while (!modem.init(SIMPIN, &devStatus, D4)) { pc.printf("\x1b[34m"); pc.printf("MODEM init failed...\n\r"); pc.printf("\x1b[0m"); wait(1); } while (!modem.checkNetStatus(&netStatus)) { pc.printf("\x1b[34m"); pc.printf("MODEM net_status failed...\n\r"); pc.printf("\x1b[0m"); wait(1); } modem.dumpDevStatus(&devStatus); } int main(void) { // setting baud rate for serial communication with the pc pc.baud(115200); pc.printf("TEST\n\r"); init_modem(); // main loop while(1) { // blink once for each measure blink(); // getting sensor values // acquisition(); // changing state of automata according to read values automate(); wait(MEASURE_INTERVAL); } }