Temperature Sensor DHT readings to FRDMk64f

Dependencies:   DHT

Fork of Hexi_Blinky_Example by Hexiwear

main.cpp

Committer:
roborags
Date:
2017-03-31
Revision:
15:67a7cca7ae06
Parent:
14:02ddfa711646
Child:
16:39e45e59677c

File content as of revision 15:67a7cca7ae06:


#include "mbed.h"
#include "ESP8266.h"               // Include header file from Author: Antonio Quevedo
#include "math.h"
#include "DHT.h"
#include <string>

#define APIKEY JJAOBK32WOINKT00    //Put "Write key" of your channel in thingspeak.com 
#define IP "184.106.153.149"       // IP Address of "api.thingspeak.com\"
#define WIFI_SSID "Batman2G"
#define WIFI_PASS "Alien12345"

Serial FRDM_UART_Debug(USBTX,USBRX);

ESP8266 ESP_8266_UART(PTC17, PTC16, 115200); // UART for ESP8266 Wifi module
// Options are TX-RX - PTB11 - PTB10 , PTC17 - PTC16 , PTC15 - PTC14

SPI SPI_Bus(PTD2,PTD3,PTD1); // (MOSI MISO CLK)setup SPI interface
DigitalOut SPI_CS_AMM(PTC3);
DigitalOut SPI_CS_VOLT(PTC2);

I2C I2C_Bus(PTE25,PTE24);

AnalogIn AN_Thermo(PTB3); // Thermocouple Analog Input

DigitalIn DG_Motion(PTB2); // Motion module Digital Input

DHT DHT_Temp_Hum(PTC11,DHT22); //DHT Sensor

const int Light_I2C_Addr = 0x88;

char ESP_8266_CMD_Send[255],ESP_8266_CMD_Recv[1000];           //ESP_8266_CMD_Send = string used to send command to ESP8266 &  ESP_8266_CMD_Recv = string used to receive response from ESP8266

float Amm_Out = 0;
float Volt_Out = 0;
float Light_Out = 0;
float Thermo_Out = 0;
float Temp_Out = 0;
float Hum_Out = 0;
int Motion_Out = 0;
int Finger_Out = 0;
float Pres_Out = 0;


void ESP_8266_Init(void); // Function used to initialize ESP8266 wifi module 
void ESP_8266_TX_Data(void);       // Function used to connect with thingspeak.com and update channel using ESP8266 wifi module 

int main() 
{
    int SPI_High_byte = 0;
    int SPI_Low_byte = 0; 
    float Temp_f_1 = 0.00;
    float Temp_f_2 = 0.00;
    int Temp_i_1 = 0;
    int Temp_i_2 = 0;
    int Temp_i_3 = 0;
    char I2C_Cmd[3];
    int loop_count = 0;
    
    FRDM_UART_Debug.baud(115200);           // Baud rate used for communicating with Tera-term on PC
    
    ESP_8266_Init();
    
    SPI_Bus.format(8,0);
    SPI_Bus.frequency(1000000);
    
    I2C_Bus.frequency(100000); // set required i2c frequency
    
    FRDM_UART_Debug.printf("Start sampling data\r\n");  // Starting point
    
    while (1) 
    {
        Amm_Out = 0;
        Volt_Out = 0;
        Light_Out = 0;
        Thermo_Out = 0;
        Temp_Out = 0;
        Hum_Out = 0;
        Motion_Out = 0;

        wait(15);
        
        // Copy Motion values
        
        Motion_Out = DG_Motion;
        
        // Ammeter
        
        SPI_High_byte = 0;
        SPI_Low_byte = 0; 
        Temp_f_1 = 0.00;
        Temp_f_2 = 0.00;
        Temp_i_1 = 0;
        Temp_i_2 = 0;
        Temp_i_3 = 0;
        I2C_Cmd[0] = 0;
        I2C_Cmd[1] = 0;
        I2C_Cmd[2] = 0;
        loop_count = 0;
        
        SPI_CS_AMM = 0;
        
        SPI_High_byte = SPI_Bus.write(0);
        SPI_Low_byte = SPI_Bus.write(0);
        
        SPI_CS_AMM = 1;
        
        Temp_f_1 = (( SPI_High_byte & 0x1f ) << 7 ) | (( SPI_Low_byte >> 1 ));
            
        Temp_f_2= (float)(( Temp_f_1 * 1.00 ) / 4096.00 ); // Converting to volts
        
        Amm_Out = (float)(( Temp_f_2 - 0.50 ) * 1000.00);
        
        FRDM_UART_Debug.printf("Current value = %f mA\r\n", Amm_Out);
        wait_ms(100);
        
        // Voltmeter
        
        SPI_High_byte = 0;
        SPI_Low_byte = 0; 
        Temp_f_1 = 0.00;
        Temp_f_2 = 0.00;
        Temp_i_1 = 0;
        Temp_i_2 = 0;
        Temp_i_3 = 0;
        I2C_Cmd[0] = 0;
        I2C_Cmd[1] = 0;
        I2C_Cmd[2] = 0;
        loop_count = 0;  
        
        SPI_CS_VOLT = 0;

        SPI_High_byte = SPI_Bus.write(0);
        SPI_Low_byte = SPI_Bus.write(0);
        
        SPI_CS_VOLT = 1;
        
        Temp_f_1 = ((SPI_High_byte & 0x1f) << 7) | ((SPI_Low_byte >> 1));
        
        Temp_f_2 = (float)((Temp_f_1 * 33) / 4096); // show value in volts.
        
        Volt_Out = (float)(Temp_f_2 - 16.5);
        
        FRDM_UART_Debug.printf("Voltage value = %f V\r\n", Volt_Out);
        wait_ms(100);
        
         //ambient light 
         
        SPI_High_byte = 0;
        SPI_Low_byte = 0; 
        Temp_f_1 = 0.00;
        Temp_f_2 = 0.00;
        Temp_i_1 = 0;
        Temp_i_2 = 0;
        Temp_i_3 = 0;
        I2C_Cmd[0] = 0;
        I2C_Cmd[1] = 0;
        I2C_Cmd[2] = 0;
        loop_count = 0;
        
        I2C_Cmd[0] = 0x01;   //configuration register
        I2C_Cmd[1]= 0xCC;    //configuration data
        I2C_Cmd[2]= 0x01;   //configuration data
        
        I2C_Bus.write(Light_I2C_Addr, I2C_Cmd, 3);
        
        I2C_Cmd[0] = 0x00; // data register
        
        I2C_Bus.write(Light_I2C_Addr, I2C_Cmd, 1);
        
        wait_ms(100);
        
        I2C_Bus.read(Light_I2C_Addr, I2C_Cmd, 2);
     
        Temp_i_1= I2C_Cmd[0]>>4;
        Temp_i_2= (I2C_Cmd[0]-(Temp_i_1<<4))*256+I2C_Cmd[1];

        for(loop_count = 0,Temp_i_3 = 1 ; loop_count < Temp_i_1 ; Temp_i_3*=2,loop_count++);
        
        Light_Out= (Temp_i_2 * Temp_i_3) / 100;
        
        FRDM_UART_Debug.printf("Lux = %.2f\n\r", Light_Out);  
        wait_ms(100); 
        
        // Thermocouple
        
        SPI_High_byte = 0;
        SPI_Low_byte = 0; 
        Temp_f_1 = 0.00;
        Temp_f_2 = 0.00;
        Temp_i_1 = 0;
        Temp_i_2 = 0;
        Temp_i_3 = 0;
        I2C_Cmd[0] = 0;
        I2C_Cmd[1] = 0;
        I2C_Cmd[2] = 0;
        loop_count = 0;
        
        Temp_f_1 = AN_Thermo.read_u16();
        
        Temp_f_1 = (( Temp_f_1 / 65536 ) * 330);
        
        Thermo_Out = Temp_f_1;
        
        FRDM_UART_Debug.printf("Thermocouple volt diff = %.2f C\r\n",Thermo_Out);
        wait_ms(100); 
        
        // Temp and Humidity
        
        SPI_High_byte = 0;
        SPI_Low_byte = 0; 
        Temp_f_1 = 0.00;
        Temp_f_2 = 0.00;
        Temp_i_1 = 0;
        Temp_i_2 = 0;
        Temp_i_3 = 0;
        I2C_Cmd[0] = 0;
        I2C_Cmd[1] = 0;
        I2C_Cmd[2] = 0;
        loop_count = 0;
        
        Temp_i_1 = DHT_Temp_Hum.readData();
        if (Temp_i_1 == 0)  // Read success
        {
            Temp_f_1 = DHT_Temp_Hum.ReadTemperature(FARENHEIT);
            Temp_f_2 = DHT_Temp_Hum.ReadHumidity();
        }
        else // Read failure
        {
            Temp_f_1 = 0;
            Temp_f_2 = 0;
        }
        
        Temp_Out = Temp_f_1;
        Hum_Out = Temp_f_2;
        
        FRDM_UART_Debug.printf("Temperature = %4.2f F ,  Humidity = %4.2f \r\n",Temp_Out,Hum_Out);
        wait_ms(100); 
        
        FRDM_UART_Debug.printf("Sending this information to thingspeak.com\r\n");
        ESP_8266_TX_Data(); 
        
    }
}


void ESP_8266_Init(void)
{    
    FRDM_UART_Debug.printf("Initializing and Reset ESP\r\n"); 
      
    ESP_8266_UART.Reset();                   //RESET ESP
    ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 400);        //receive a response from ESP
    //FRDM_UART_Debug.printf(ESP_8266_CMD_Recv);          //Print the response onscreen 
    wait(2);
    
    strcpy(ESP_8266_CMD_Send,"AT");
    ESP_8266_UART.SendCMD(ESP_8266_CMD_Send);
    FRDM_UART_Debug.printf(ESP_8266_CMD_Send);
    //wait(2);
    ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 400);       
    FRDM_UART_Debug.printf(ESP_8266_CMD_Recv);      
    wait(0.1);
    
    strcpy(ESP_8266_CMD_Send,"AT+CWMODE=1");
    ESP_8266_UART.SendCMD(ESP_8266_CMD_Send);
    FRDM_UART_Debug.printf(ESP_8266_CMD_Send);
    wait(2);
    
    if(!strcmp(ESP_8266_CMD_Recv,"WIFI CONNECTED"))
    {
        strcpy(ESP_8266_CMD_Send,"AT+CWJAP=\"");
        strcat(ESP_8266_CMD_Send,WIFI_SSID);
        strcat(ESP_8266_CMD_Send,"\",\"");
        strcat(ESP_8266_CMD_Send,WIFI_PASS);
        strcat(ESP_8266_CMD_Send,"\"");
    
        ESP_8266_UART.SendCMD(ESP_8266_CMD_Send);
        FRDM_UART_Debug.printf(ESP_8266_CMD_Send);
        wait(5);
        ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 400);       
        FRDM_UART_Debug.printf(ESP_8266_CMD_Recv); 
    }
    else 
        FRDM_UART_Debug.printf("Wifi was preconfigured\r\n"); 
        
    strcpy(ESP_8266_CMD_Send,"AT+CIPMUX=0");
    ESP_8266_UART.SendCMD(ESP_8266_CMD_Send);
    FRDM_UART_Debug.printf(ESP_8266_CMD_Send);
    //wait(2);
    ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 400);       
    FRDM_UART_Debug.printf(ESP_8266_CMD_Recv); 

}


void ESP_8266_TX_Data(void)
{
   
    //ESP updates the Status of Thingspeak channel//
    
    strcpy(ESP_8266_CMD_Send,"AT+CIPSTART=");
    strcat(ESP_8266_CMD_Send,"\"TCP\",\"");
    strcat(ESP_8266_CMD_Send,IP);
    strcat(ESP_8266_CMD_Send,"\",80");
    
    ESP_8266_UART.SendCMD(ESP_8266_CMD_Send); 
    FRDM_UART_Debug.printf("S\r\n%s",ESP_8266_CMD_Send);
    //wait(2);                                                    
    ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 1000);
    FRDM_UART_Debug.printf("R\r\n%s",ESP_8266_CMD_Recv);
    wait(1);
    
    /*
        float Amm_Out = 0;
        float Volt_Out = 0;
        float Light_Out = 0;
        float Thermo_Out = 0;
        float Temp_Out = 0;
        float Hum_Out = 0;
        int Motion_Out = 0;
    */
    sprintf(ESP_8266_CMD_Send,"GET https://api.thingspeak.com/update?key=JJAOBK32WOINKT00&field1=%d&field2=%d&field3=%f&field4=%f&field5=%f&field6=%f&field7=%f&field8=%f\r\n"
            ,Motion_Out,Finger_Out,Amm_Out,Volt_Out,Light_Out,Thermo_Out,Temp_Out,Hum_Out);
    
    int i=0;
    for(i=0;ESP_8266_CMD_Send[i]!='\0';i++);
    i++;
    char cmd[255];
    
    sprintf(cmd,"AT+CIPSEND=%d",i);                                       //Send Number of open connection and Characters to send 
    ESP_8266_UART.SendCMD(cmd);
    FRDM_UART_Debug.printf("S\r\n%s",cmd);
    while(i<=20 || ESP_8266_CMD_Recv == ">")
    {
        ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 1000);
        wait(100);
        i++;
    }
    FRDM_UART_Debug.printf("R\r\n%s",ESP_8266_CMD_Recv);
    
    ESP_8266_UART.SendCMD(ESP_8266_CMD_Send);                                                      //Post value to thingspeak channel
    FRDM_UART_Debug.printf("S\r\n%s",ESP_8266_CMD_Send);
    
    while(i<=20 || ESP_8266_CMD_Recv == "OK")
    {
        ESP_8266_UART.RcvReply(ESP_8266_CMD_Recv, 1000);
        wait(100);
        i++;
    }
    FRDM_UART_Debug.printf("R\r\n%s",ESP_8266_CMD_Recv);
    
}