Level measurement using range finder and lora technology

Dependencies:   Cayenne-LPP SDBlockDevice

main.cpp

Committer:
wamae
Date:
2019-06-26
Revision:
0:f930f0440fd5

File content as of revision 0:f930f0440fd5:

#include "mbed.h"
#include "hcsr04.h"
#include "SDBlockDevice.h"
#include  "FATFileSystem.h"
//#include "MQTTTimer.h"
//#include "CayenneMQTTClient.h"
//#include "MQTTNetworkIDW01M1.h"
#include "lorawan_network.h"
#include "CayenneLPP.h"
#include "mbed_events.h"
#include "mbed_trace.h"
#include "lora_radio_helper.h"
#include "SX1276_LoRaRadio.h"
#include "LoRaWANInterface.h"
//#include "stm32_standby.h"




//#define STANDBY_TIME_S                 1* 60

extern EventQueue ev_queue;

static uint32_t DEV_ADDR_1   =      0x260118FA;
static uint8_t NWK_S_KEY_1[] =      { 0x5D, 0xD5, 0xC9, 0x84, 0xB9, 0xCE, 0x26, 0x05, 0xB7, 0x61, 0xBF, 0x9F, 0x3C, 0x2D, 0x4E, 0x14 };
static uint8_t APP_S_KEY_1[] =      { 0xF0, 0xE4, 0xA1, 0xEB, 0x1F, 0xB5, 0x6E, 0xBA, 0x31, 0x69, 0x80, 0x9D, 0x85, 0x92, 0x68, 0xB4 };
SDBlockDevice sd(PC_12, PC_11, PC_10, D10);// mosi, miso, sclk, cs
FATFileSystem fs("sd");
FlashIAP flash;
 
void apply_update(FILE *file, uint32_t address);
 
HCSR04 sensor(D4, D3);
//Serial pc(USBTX, USBRX);
//FILE *fp;                                   // File pointer declear


int dw,d,M,y,h,m,s;  //VARIABLES FOR TIME AND YEAR


//global variable
long distance;

 bool dist_updated = false;
 float volume;  


    
void dist_measure(){
    sensor.start();
    wait_ms(100); 
    distance=sensor.get_dist_cm();
    volume = 6*6*(2-(distance*0.01));
    dist_updated = true;
    
    }
    
void check_for_updated_dist() { 

    if (dist_updated){
        dist_updated = false ;
        printf("Measure Distance = %ld ",distance);
        printf("Volume=%3.0f\n", volume);
        
        CayenneLPP payload(50);
        float volume_value = volume;
        printf("Volume_value=%f\n", volume_value);
        payload.addAnalogInput(4, volume_value);
        
        if (!lorawan_send(&payload)){
           // delete distance;
           // standby(STANDBY_TIME_S);
           
            }
        }
    }
/*void SetDateTime(int year = 2019, int mon = 1, int day = 1, int hour = 0, int min = 0, int sec = 0) {
    struct     tm Clock;
    Clock.tm_year = year - 1900;
    Clock.tm_mon  = mon - 1;      // note: subtract 1 
    Clock.tm_mday = day;
    Clock.tm_hour = hour;
    Clock.tm_min  = min;
    Clock.tm_sec  = sec;
    time_t epoch = mktime(&Clock);
    if (epoch == (time_t) -1) {
        error("Error in clock setting\n");
        // Stop here
    }
    set_time(epoch);
}*/

static void lora_event_handler(lorawan_event_t event) {
    switch (event) {
        case CONNECTED:
            printf("[LNWK][INFO] Connection - Successful\n");
            break;
        case DISCONNECTED:
            ev_queue.break_dispatch();
            printf("[LNWK][INFO] Disconnected Successfully\n");
            break;
        case TX_DONE:
            printf("[LNWK][INFO] Message Sent to Network Server\n");
            
         //   delete distance;
            //standby(STANDBY_TIME_S);
             
            break;
        case TX_TIMEOUT:
        case TX_ERROR:
        case TX_CRYPTO_ERROR:
        case TX_SCHEDULING_ERROR:
            printf("[LNWK][INFO] Transmission Error - EventCode = %d\n", event);
             

            //delete distance;
           // standby(STANDBY_TIME_S);
           
            break;
        case RX_DONE:
            printf("[LNWK][INFO] Received message from Network Server\n");
            receive_message();
            break;
        case RX_TIMEOUT:
        case RX_ERROR:
            printf("[LNWK][INFO] Error in reception - Code = %d\n", event);
            break;
        case JOIN_FAILURE:
            printf("[LNWK][INFO] ABP Failed - Check Keys\n");
            break;
        default:
            MBED_ASSERT("Unknown Event");
    }
}

void sd_write(){ 
   
 //END OF CODE USED FOR OBTAINING TIME
    sensor.start();
    wait_ms(100); 
    long distance=sensor.get_dist_cm();
     printf("distance is %dcm\n", distance);
     wait_ms(1000);      
     
    }
 int main() {
          
    printf("=========================================\n");
    printf("      Water Level Monitoring System        \n");
    printf("=========================================\n");
     char date[64];      //string for storing the current date
    char timeofday[64]; //string for storing the current time
    
       struct tm t;        //time structure for setting the time
   
    //set time structure to 20 Sep 2016 00:31:01
    time_t rawtime;
    //time_t seconds;     //time_t variable to read the number of seconds since January 1, 1970 for time calculations 
   //set_time(rawtime);
  struct tm * timeinfo;

  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  
  printf ( "Current local time and date: %s", asctime (timeinfo) );
    t.tm_year = 2019 - 1900;
    t.tm_mon = 6 - 1;
    t.tm_mday = 19;
    t.tm_hour = 14;
    t.tm_min = 23;
    t.tm_sec = 8;
         
    
    //use the time structure and set the real-time clock (RTC) time
    set_time(mktime(&t));
    while (true)
    {
    lorawan_setup(DEV_ADDR_1, NWK_S_KEY_1, APP_S_KEY_1, lora_event_handler);

    printf("Measuring Distance...\n");
  
    //immediately measure the distance
     sensor.start();
     wait_ms(100);
     distance = sensor.get_dist_cm();
    printf("Measuring Dist =%ld...\n",distance);
     
   
    // Try to mount the filesystem.
   printf("Mounting the filesystem... ");
 
    int err = fs.mount(&sd);
    printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n"));
    if (err)
        return err;    
      
      // Open a file.
    printf("Opening file '/sd/mylogger.txt'... ");
    FILE*  fp = fopen("/sd/mylogger.txt", "a");            // File open for "a"ppend
    if (fp == NULL) {                               // Error!
           // printf("Unable to write the file\r\n");
           
        } 
        else {
             char buffer[64];
        strftime(buffer, 64, "%I:%M %p\n", localtime(&rawtime));
       // printf("Time as a custom formatted string = %s", buffer);
        time_t seconds = time(NULL);                                           //read the new time value
        strftime(date, 64, "%d/%m/%y", localtime(&rawtime));            //create a date string from the time value
        strftime(timeofday, 64, "%H:%M:%S", localtime(&rawtime));       //create a time string from the time value     
        fprintf(fp, "%s %s %dcm\r\n", date, timeofday, distance);   //write the date string, time string, and analog integer value to the file
                                                                                //the /r/n combination puts the entries on different lines in the file
    //printf("%dcm ",distance);          // Append data to SD card.
    //fprintf(fp, "%dcm\r\n",distance);        // Serial monitor.
        }
    fclose(fp); 
                                       // Cloce file.
                                       wait(20);
    printf("File successfully written!\r\n");    // Serial monitor.    
    dist_measure();
    ev_queue.call_every(3000, &check_for_updated_dist);       
    ev_queue.dispatch_forever();

     printf ( "Current local time and date: %s", asctime (timeinfo) );
      
    }  
    
}