SysBee v1

Dependencies:   C027_Support mbed

Fork of App_Pese_Ruche_SYSBEE by Sysbee

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);
    }
}