Code for sensor nodes connected by radio receiver with gateway

Dependencies:   mbed WakeUp coapRadioClient DHT11

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mainDistance.cpp Source File

mainDistance.cpp

00001 #include "sensor.h"
00002 #include "mbed.h"
00003 #include "msg.h"
00004 #include "dbg.h"
00005 #include "coapClient.h"
00006 #include <string>
00007 
00008 // https://os.mbed.com/users/Sissors/code/WakeUp/
00009 #include "WakeUp.h"
00010 
00011 #include "DHT11.h"
00012 #include "distanceMeter.h"
00013 
00014 #define DATA_BUFFER_LEN 10
00015 #define BUFFER_LEN 32
00016 #define CHANNEL 4
00017 #define RX_ADDRESS 0xABCDEF08
00018 #define TX_ADDRESS 0xABCDEF13
00019 #define DATA_RATE 1000
00020 #define RETRANSMITS 4
00021 
00022 char postUri[] = "/dist";
00023 char getConfUri[] = "/conf/dist";
00024 
00025 Serial pc(USBTX, USBRX, 115200); // tx, rx
00026 PinName pinA = PinName(PB_3);
00027 PinName pinB = PinName(PA_10);
00028 uint8_t token[] = {2};
00029 CoapClient coapClient = CoapClient(1, token, RETRANSMITS, DATA_RATE, CHANNEL, RX_ADDRESS, TX_ADDRESS);
00030 InterruptIn button(USER_BUTTON);
00031 
00032 
00033 // change this
00034 DistanceMeter sensor = DistanceMeter(pinA, pinB);
00035 
00036 int config_interval = 30;
00037 int sense_interval = 10;
00038 
00039 int config_time_left = 0;
00040 int sense_time_left = 0;
00041 
00042 void check_for_new_config() {
00043     uint8_t buffer[BUFFER_LEN];
00044     int ret = coapClient.get(buffer, BUFFER_LEN, getConfUri);
00045     if(ret > 0) {
00046         uint8_t sensor_id = 0;
00047         int data = -1;
00048         Msg::deconstruct_data_msg(&sensor_id, &data, buffer, ret);
00049         DBG("INTERVAL: %d", data);
00050         sense_interval = data;
00051     }
00052     DBG("GET: %d", ret);
00053 }
00054 
00055 void collect_and_send_data() {
00056     uint8_t buffer[DATA_BUFFER_LEN];
00057     int data = sensor.read();
00058     DBG("DATA: %d", data);
00059     int sensor_id = sensor.getSensorId();
00060     // TODO put sensor_id in URI, not in payload
00061     Msg::construct_data_msg(sensor_id, data, buffer, DATA_BUFFER_LEN);
00062     int ret = coapClient.post(buffer, DATA_BUFFER_LEN, postUri);
00063     DBG("POST: %d", ret);
00064 }
00065 
00066 bool start = false;
00067 void send_packet() {
00068     DBG("Start");
00069     start = true;
00070 }
00071 
00072 
00073 int main() {
00074     WakeUp::calibrate();
00075     sensor.initialize();
00076     DBG("RESTART");
00077     int czas_na_spanko = 1;
00078     Timer t;
00079     button.rise(&send_packet);
00080     while(true) {
00081         while(start) {
00082             if (config_time_left <= 0) {
00083                 check_for_new_config();
00084                 config_time_left = config_interval;
00085             }
00086             if (sense_time_left <= 0) {
00087                 collect_and_send_data();
00088                 sense_time_left = sense_interval;
00089             }
00090 
00091             czas_na_spanko = min(config_time_left, sense_time_left);
00092             DBG("SPANKO: %d", czas_na_spanko);
00093             if(czas_na_spanko > 0) {
00094                 t.stop();
00095                 //WakeUp::set(czas_na_spanko);
00096                 wait(czas_na_spanko);
00097                 t.reset();
00098                 t.start();
00099                 config_time_left -= czas_na_spanko;
00100                 sense_time_left -= czas_na_spanko;
00101             } else {
00102                 config_time_left -= t.read_ms();
00103                 t.stop();
00104                 t.reset();
00105                 t.start();
00106             }
00107         }
00108     }
00109 }