Data to Thingspeak Over Ethernet Port

Dependencies:   mbed HTTPClient mbed-rtos NTPClient EthernetInterface

main.cpp

Committer:
rbagwe
Date:
2017-03-23
Revision:
0:0666873f31ca
Child:
4:21c1357bb880

File content as of revision 0:0666873f31ca:

#include "mbed.h"
#include "DHT.h"
#include "EthernetInterface.h"
#include  "HTTPClient.h"
#include "SDFileSystem.h"
#include "NTPClient.h"
#include <stdio.h>

//Setting the motor Pin
DigitalOut motorPin(D10);

//DHT pin number & type
DHT temp_sensor(PTB23, DHT22);

//Ethernet Interface
EthernetInterface eth;

//HTTP Client for interfacing to web services
HTTPClient http;

//NTP service for date and Time used to set boards RTC
NTPClient ntp;

//serial over USB for debug and Info
Serial pc(USBTX, USBRX);

//Declaring the variable for LED
//DigitalOut red(LED1);

DigitalOut redLED(LED1);
DigitalOut greenLED(LED2);
DigitalOut blueLED(LED3);
DigitalOut solenoid(D12);
DigitalIn button1(D2);
DigitalIn button2(D3);
DigitalIn button3(D5);
DigitalIn button4(D6);

InterruptIn switch1(SW2);

SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCLK, SSEL

/*----Global Variables------*/
int clickNum=0;
int i;
int passwordAttempt[4]= {0,0,0,0};      //user input passcode array
int correctPassword[4]= {1,3,2,4};      //the button passcode array
bool passStatus=false;
int passwordWaiter;
bool v=0;

char resp[1024]; //buffer for the response
float f = 0.0f, f_out = 0.0f;           //variables to store the temperature value
int error_temp = 0;                     //temperature sensor error flag
int ret = 0;
char val[4][16];                        //to store sensor value
char f1_read[3];
int temp_limit = 1;                     //boolean trigger based on value read from thingspeak

//http client init
HTTPMap map;
HTTPText inText(resp, 1024);

float temperature;
time_t ctTime;
NTPResult result;

/*-----Functions------*/
bool checkPassword(int passAtt[]){
    for(i=0;i<4;i++){
        if(passAtt[i]!=correctPassword[i]){
            return false;
        }
    }
    return true;
}

void clearCounters(){
    clickNum=0;
    passwordAttempt[0]=0;
    passwordAttempt[1]=0;
    passwordAttempt[2]=0;
    passwordAttempt[3]=0;
    passStatus=false;
    passwordWaiter=0;
}


void temperature_control(){
    error_temp = temp_sensor.readData();
    f = 0;
    if (0 == error_temp) {
        for(int itd = 0; itd<3; itd++){
            f = f + temp_sensor.ReadTemperature(FARENHEIT);
            wait_ms(10);
        }
        f_out = f/3.0f;
    }

    if(f_out!= 0.0f){
        map.put("api_key","ORFC8WKYY3OG0K7Y");
        sprintf(val[0],"%4.1f",f_out);
        map.put("field1", val[0]);
        pc.printf("\nTrying to post data...\n");
        ret = http.post("https://api.thingspeak.com/update", map, &inText);     //writing data to Thingspeak
        if (!ret){
            pc.printf("Executed POST successfully - read %d characters\n", strlen(resp));
            pc.printf("Result: %s\n", resp);
        }else{
            pc.printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
        }
    }
    wait(2.0f);

    http.get("https://api.thingspeak.com/channels/242557/fields/1/last?api_key=09DPKTKBCFUW9N6T", f1_read, 3);  //Reading data from Thingspeak
    pc.printf("Read Data is %s\n", f1_read);
    sscanf(f1_read, "%d", &temp_limit);

    if (!temp_limit){
        motorPin = 1;
    }else{
        motorPin = 0;
    }
}

void button_pad(){
    pc.printf("Enter the password: \n");
    while(clickNum!=4 && passwordWaiter<=100){
        if(button1){
            passwordAttempt[clickNum]=1;
            clickNum++;
            pc.printf("Button 1 Pressed: %d\n",clickNum);
            while(button1){redLED=1;}
            redLED=0;
        }else if(button2){
            passwordAttempt[clickNum]=2;
            clickNum++;
            pc.printf("Button 2 Pressed: %d\n",clickNum);
            while(button2){redLED=1;}
            redLED=0;
        }else if(button3){
            passwordAttempt[clickNum]=3;
            clickNum++;
            pc.printf("Button 3 Pressed: %d\n",clickNum);
            while(button3){redLED=1;}
            redLED=0;
        }else if(button4){
            passwordAttempt[clickNum]=4;
            clickNum++;
            pc.printf("Button 4 Pressed: %d\n",clickNum);
            while(button4){redLED=1;}
            redLED=0;
        }
        passwordWaiter++;
        wait(.3);
    }//end while
    passStatus=checkPassword(passwordAttempt);

    if(passStatus==true){
        pc.printf("Right!\n\n");
        solenoid = 1;
        redLED=1;
        wait(0.2);
        blueLED=1;
        wait(0.2);
        greenLED = 0;
        wait(3);
        greenLED=1;
        wait(.2);
        solenoid = 0;
    }else{
        printf("Wrong!\n\n");
        greenLED = 1;
        for(i=0;i<3;i++){
            wait(.2);
            redLED=1;
            wait(0.2);
            blueLED=0;
            wait(.5);
            blueLED=1;
        }
    }

    redLED=0;
    clearCounters();

}

void SDcard_logging(){
    time(&ctTime);
    temperature = f_out;
    FILE *fp = fopen("/sd/mydir/Record.csv", "a");

    if(fp == NULL) {
        error("Could not open file for write");
    }
    fprintf(fp, "%s,", ctime(&ctTime));
    fprintf(fp, "%4.1f", temperature);
    fclose(fp);
}


void switch1ISR(){
    switch1.fall(NULL);
    v=1;
    switch1.fall(&switch1ISR);
}





int main(){

    //ethernet init
    eth.init(); //Use DHCP
    ret= eth.connect();

    if (!ret){
            pc.printf("Connected, IP: %s, MASK: %s, GW: %s\n",
            eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
    } else {
        pc.printf("Error eth.connect() - ret = %d\n", ret);
    }

    wait(0.5);
    clickNum=0;
    greenLED = 1;
    blueLED = 1;
    redLED = 0;
    wait(.2);

    button_pad();

    mkdir("/sd/mydir", 0777);
    FILE *fp = fopen("/sd/mydir/Record.csv", "w");
    fprintf(fp, "Time, Temperature\r\n");
    fclose(fp);

    result = ntp.setTime("pool.ntp.org");
    if (result == NTP_OK) {
        time(&ctTime);
        pc.printf("Time is set to (UTC):\n%s\n", ctime(&ctTime));
    }else{
        pc.printf("Error setting Time\n");
    }

    switch1.fall(&switch1ISR);

    while(1){
        temperature_control();
        if(v){
            button_pad();
            SDcard_logging();
            v=0;
        }
    }
}