read water level from aduino water sensor, and forward it ti artik 710 board. and It controls humidifier by 2 channel relay module

Dependencies:   MbedJSONValue WebSocketClient

source/main.cpp

Committer:
Dongho
Date:
2018-01-09
Revision:
0:a3a9a2aa25eb

File content as of revision 0:a3a9a2aa25eb:


#include <string>
#include <vector>
#include "mbed.h"
#include "easy-connect.h"
#include "Websocket.h"
#include "MbedJSONValue.h"

 /* connect this pin to both the CH_PD (aka EN) & RST pins on the ESP8266 just in case */
#define _threshold 2000.0
#define SERVER_IP "192.168.0.9" 
#define SERVER_PORT 8080

Serial pc(USBTX, USBRX); // computer to mbed boardSerial esp(D1, D0);
AnalogIn analog_value(A0);
DigitalOut relay(D4);



Thread recvThread;
int power = 0;

char* str_to_char(std::string str){
    std::vector<char> writable(str.begin(), str.end());
    writable.push_back('\0');
    char* ptr = &writable[0];
    
    return ptr;
}

std::string send_data(float level, std::string name){
    MbedJSONValue data_json;
    
    data_json["type"] = "value";
    if(!strcmp(name.c_str(), "waterlevel")){
        data_json["name"] = name;
    } else if(!strcmp(name.c_str(), "humidity"))   {
        data_json["name"] = name;   
    }
    data_json["value"] = level;
 
    return data_json.serialize();
 }
 
 std::string send_ack(int id, std::string type, std::string name, std::string value, std::string tgt_type, int tgt_idx){
    MbedJSONValue ack_json;
               
    ack_json["paired_action_id"] = id;
    ack_json["type"] = type;
    ack_json["name"] = name;
    ack_json["value"] = value;
    ack_json["target"]["type"] = tgt_type;
    ack_json["target"]["index"] = tgt_idx;
    
    return ack_json.serialize();
}

void recv_tcp(TCPSocket* tcp) {
    char recvBuffer[200] = {0, };
    while (1) {
        if (tcp->recv(recvBuffer, sizeof(char) * 200)) {
            
            char value[100] = {0, };
            int idx = 0;
            int tgt_idx = 0;
            sscanf(recvBuffer, "{\"id\":%d,\"type\":\"action\",\"name\":\"power_control\",\"value\":\"%s\",\"target\":{\"type\":\"humidifier\",\"index\":%d}}", &idx, value, &tgt_idx);
             
            if(strstr(value, "on") == value) {
                if(power == 1){
                    pc.printf("power is already on\r\n");
                }
                else{
                    relay.write(0);
                    power = 1;
                    pc.printf("power on\r\n");
                    
                    std::string send_msg = send_ack(idx, "status", "power_state", "on", "humidifier", tgt_idx);
                    pc.printf("send ack: %s\r\n", send_msg.c_str());
                     
                    int scount = tcp->send(str_to_char(send_msg), send_msg.size());
                    pc.printf("length of message : %d\r\n", scount);
                }
                  
            } else if(strstr(value, "off") == value) {
                if(power == 0){
                    pc.printf("power is already off\r\n");
                }
                else{
                    relay.write(1);
                    power = 0;
                    pc.printf("power off\r\n");
                    
                    std::string send_msg = send_ack(idx, "status", "power_state", "off", "humidifier", tgt_idx);
                    pc.printf("send ack: %s\r\n", send_msg.c_str());
                     
                    int scount = tcp->send(str_to_char(send_msg), send_msg.size());
                    pc.printf("length of message : %d\r\n", scount);
                }
            }
            else {
                pc.printf("%s", value);    
            }
        }
    }
}

int main() {

    pc.baud(115200);
    relay.write(1);
    power = 0;
    
    pc.printf("\r\n TCP connection\r\n");
    pc.printf("Resetting ESP8266 Hardware...\r\n");

    wait_ms(500);

    NetworkInterface *network = easy_connect(true);
    
    
    while (1) {        
        TCPSocket socket; // for HTTP
    
        // Open a socket on the network interface, and create a TCP connection
        socket.open(network);
        bool status = socket.connect(SERVER_IP, SERVER_PORT);
  
        if (status == true) {
            recvThread.start(&socket, recv_tcp);
            
            while(1) {
                float meas_lev = analog_value.read(); // Converts and read the analog input value (value from 0.0 to 1.0)
                meas_lev = meas_lev * 3300; // Change the value to be in the 0 to 3300 range
    
                if(meas_lev <= _threshold){
                   pc.printf("alert!: water level is low\r\n");
                }
                
                pc.printf("Current water level: %.2f\r\n", meas_lev);
                std::string send_msg = send_data(meas_lev, "waterlevel");
                
                pc.printf("send data: %s\r\n", send_msg.c_str());
                int scount = socket.send(str_to_char(send_msg), send_msg.size());
                pc.printf("length of message : %d\r\n", scount);
                
                if(scount == -3012){
                    recvThread.terminate();
                    break;
                }
                
                Thread::wait(3000);
            }
        }    
        socket.close();
    }
}



/*
#include "mbed.h"
 #include "MbedJSONValue.h"
 #include <string>
 
 Serial pc(USBTX, USBRX);
 
 int main() {     
    MbedJSONValue recv_json;
    pc.baud(115200);
    
    char value[64] = {0, };
     
    const  char * json = "{\"id\":0,\"type\":\"action\",\"name\":\"power_control\",\"value\":\"off\",\"target\":{\"type\":\"humidifier\",\"index\":0}}";
    // parse(recv_json, json);
            
    pc.printf("recv %s\r\n", json);
 
    sscanf(json, "{\"id\":0,\"type\":\"action\",\"name\":\"power_control\",\"value\":\"%s\",\"target\":{\"type\":\"humidifier\",\"index\":0}}", value);
    
    if(strstr(value, "on") == value) {
        pc.printf("on found");
    } else if(strstr(value, "off") == value) {
        pc.printf("off found");
    }
    
    return 0; 
 }

*/