Melbourne specific temperature/humidity sensor

Dependencies:   EALib EthernetInterface SHTx mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
BPPearson
Date:
Fri May 06 10:19:50 2016 +0000
Commit message:
First revision - Melbourne specifics
;

Changed in this revision

EALib.lib Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
SHTx.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 4bbf12d35a8c EALib.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EALib.lib	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/embeddedartists/code/EALib/#74540582e639
diff -r 000000000000 -r 4bbf12d35a8c EthernetInterface.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/EthernetInterface/#d1ccbed7687a
diff -r 000000000000 -r 4bbf12d35a8c SHTx.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SHTx.lib	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/BPPearson/code/SHTx/#189a7d9ddc40
diff -r 000000000000 -r 4bbf12d35a8c main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,446 @@
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "QSPIFileSystem.h"
+#include "SHTx/sht15.hpp"
+ 
+ 
+#define ECHO_SERVER_PORT   7
+#define on 0
+#define off 1
+#define DESIRED_SIZE_IN_MB  (1)
+
+// devices 
+Serial pc(USBTX, USBRX); // tx, rx
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+DigitalIn ipReset(p23,PullUp);
+QSPIFileSystem qspifs("qspi");
+SHTx::SHT15 sensor(p32, p31);
+EthernetInterface eth;
+TCPSocketServer server;
+TCPSocketConnection client;
+Ticker oneSecondTick;
+DigitalOut hostQueryLED(p24);
+DigitalOut timingPulse(p25);
+
+// variables
+char ipStr[20];
+char subnetStr[20];
+char gatewayStr[20]; 
+char inBuff[256];
+char outBuff[256];
+float currTemperature = 25.4;
+float currHumidity = 78.3;
+int flashLedCnt = 4;
+int cnt = 0;
+bool sensorCommsFault;
+int ipResetCount = 0;
+ 
+// procedure declarations
+void initSensor();
+void readSensor();
+void oneSecondTimer();
+bool readConfigFile();
+void writeConfigFile();
+void processRcvBuffer(char *inBuff);
+
+ 
+ 
+int main() 
+{
+    char *macAddr;
+    //char *hello = "Hello\n";
+    
+    // get mac address and print it to PC
+    //macAddr = eth.getMACAddress();
+    //pc.printf("MAC address %s\n", macAddr);
+    
+    // check if file system already formatted
+    if (!qspifs.isformatted()) 
+    {        pc.printf("Format qspi file system\n");
+        qspifs.format(DESIRED_SIZE_IN_MB);
+    }
+ 
+    // try to read config file which contains the IP address, subnet and gateway
+/*    if (readConfigFile())
+    {
+        pc.printf("Config file ethernet details\n %s\n %s\n %s\n", ipStr, subnetStr, gatewayStr);
+        // set IP address from config file    
+        eth.init(ipStr, subnetStr, gatewayStr);
+    }
+    else
+    {
+        pc.printf("default ethernet address\n");
+        // set to a default IP address, subnet and gateway
+        strcpy(ipStr, "10.39.123.123");
+        strcpy(subnetStr, "255.255.0.0");
+        strcpy(gatewayStr,"10.39.1.1");
+
+        // initialise the IP stack to these defaults
+        eth.init(ipStr, subnetStr, gatewayStr); 
+        
+        // save default settings as working config
+        writeConfigFile();
+    }
+*/
+
+    eth.init(); //Use DHCP
+    eth.connect();
+
+    // get mac address and print it to PC
+    macAddr = eth.getMACAddress();
+    pc.printf("MAC address %s\n", macAddr);
+
+    pc.printf("IP Address is %s\n", eth.getIPAddress());
+
+    // turn off all the leds on the chip
+    led1 = 1;
+    led2 = 1;
+    led3 = 0;
+    led4 = 0;
+  
+    // bind to the required port      
+    server.bind(ECHO_SERVER_PORT);
+    
+    // put into listen mode
+    server.listen();
+    
+    // initialise the sensor
+    initSensor();
+    
+    // start the one second tick that does periodic tasks such as read the sensor and toggle the activity LED
+    oneSecondTick.attach(&oneSecondTimer, 1);
+    
+    // do forever
+    while (1)
+    {
+        // configure stack ready to accept a client connection        
+        server.accept(client);
+ 
+        // wait for a connection request from the client (receipt of a packet)
+        client.set_blocking(true, 0);
+        
+        // get received packet from client
+        int n = client.receive(inBuff, sizeof(inBuff));
+
+        // process the request from the client
+        processRcvBuffer(inBuff);
+        
+        // close the client connection        
+        client.close();
+
+        // pulse LED 4 to show ethernet activity
+        hostQueryLED = 0;
+        wait(0.1);
+        hostQueryLED = 1;
+
+        //pc.printf("Sensor update\n");
+        //pc.printf("Temp %5.1f, Humidity %5.1f\n", currTemperature, currHumidity );
+    }}
+
+
+
+void initSensor()
+{
+    
+    // reset sensor just to check if it can be communicated with (returns true)
+    if (sensor.reset())
+    {
+        sensorCommsFault = false;
+        pc.printf("Sensor reset\n");
+        
+        // set temperature in celcius
+        sensor.setScale(false);
+
+        // optimise speed of sensor
+        if (!sensor.setOTPReload(false))
+        {
+            sensorCommsFault = true;
+            pc.printf("Set OTP reload\n");
+        }
+                    
+        // set resolution to high (14 bits for temperature, 12 bits for humidity)
+        if (!sensor.setResolution(false))
+        {
+            sensorCommsFault = true;
+            pc.printf("Set resolution\n");
+        }
+    }
+    else
+    {
+        sensorCommsFault = true;
+        pc.printf("Sensor comms fault\n");
+    }
+}
+    
+
+void readSensor() 
+{
+    bool goodRead = false;
+    
+    if (!sensorCommsFault)
+    {
+        timingPulse = 1;
+        
+        goodRead = sensor.update();
+    
+        timingPulse = 0;
+
+        // trigger a measurement
+        if (goodRead == true)
+        {
+            // get temperature in celcius
+            currTemperature = sensor.getTemperature();
+        
+            // get relative humidity
+            currHumidity = sensor.getHumidity();
+        }
+        else
+        {
+            currTemperature = -1.0F;
+                
+            currHumidity = -1.0F;
+        }    
+            
+    }
+    else            // return error values
+    {    
+        currTemperature = -1.0F;
+            
+        currHumidity = -1.0F;
+    }        
+}
+
+
+
+void oneSecondTimer()
+{
+    
+    // if end of pulse sequence and LED still lit
+    if (flashLedCnt == 0 && led4 == 1)
+    {
+        // turn off LED
+        led4 = 0;
+    }
+        
+    // if location LED still requires pulsing
+    if (flashLedCnt > 0)
+    {
+        // toggle the LED indicator
+        led4 = flashLedCnt & 1;
+        
+        // decrement the count
+        flashLedCnt--;
+    }
+
+    // check if user pushbutton pressed (low)
+    if (ipReset == 0)
+    {
+        // increment the counter
+        ipResetCount++;
+
+        // turn on a LED for seconds 1 to 4
+        switch (ipResetCount)
+        {
+            case 1:
+                led1 = 0;
+                break;
+            case 2:
+                led2 = 0;
+                break;
+            case 3:
+                led3 = 1;
+                break;
+            case 4:
+                led4 = 1;
+                break;
+            case 5:
+                // turn off all the leds on the chip to indicate change of IP address
+                led1 = 1;
+                led2 = 1;
+                led3 = 0;
+                led4 = 0;
+                break;
+            default: ;
+        }
+        
+        // if button pressed for 5 seconds
+        if (ipResetCount >= 5)
+        {
+            // initialise the IP address back to the default value
+            strcpy(ipStr, "10.39.123.123");
+            strcpy(subnetStr, "255.255.0.0");
+            strcpy(gatewayStr,"10.39.1.1");
+            
+            // save to config file
+            writeConfigFile();
+        }
+    }
+    else
+    {
+        // reset the counter
+        ipResetCount = 0;
+
+        // turn off all the leds on the chip
+        led1 = 1;
+        led2 = 1;
+        led3 = 0;
+        led4 = 0;
+    }
+}
+
+
+bool readConfigFile()
+{
+    int digits;
+    int octet1, octet2, octet3, octet4;
+    bool ipOk = false;
+    bool subnetOk = false;
+    bool gatewayOk = false;
+
+    // open file pointer to config data    
+    FILE *fp = fopen("/qspi/config.dat", "r");
+
+    // if open successful
+    if (fp != NULL)
+    {
+        // read 20 byte blocks for each parameter
+        fread(ipStr, 20, 1, fp);
+        fread(subnetStr, 20, 1, fp); 
+        fread(gatewayStr, 20, 1, fp); 
+        
+        // close the file pointer
+        fclose(fp);
+
+        // break the IP address down to individual octets and return number of octets read
+        digits = sscanf(ipStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+
+        // check if 4 octets and all within range
+        if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+            ipOk = true;
+
+        // break the subnet down to individual octets and return number of octets read
+        digits = sscanf(subnetStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+        
+        // check if 4 octets and all within range
+        if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+            subnetOk = true;
+            
+        // break the gateway down to individual octets and return number of octets read
+        digits = sscanf(gatewayStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+        
+        // check if 4 octets and all within range
+        if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+            gatewayOk = true;
+            
+        // if IP address, subnet and gateway valid
+        if (ipOk && subnetOk && gatewayOk)
+            return true;
+        else
+            return false;
+    }
+    return false;
+}
+
+
+
+void writeConfigFile()
+{
+
+    // open file pointer to config data file
+    FILE *fp = fopen("/qspi/config.dat", "w");
+
+    // if valid handle returned
+    if (fp != NULL)
+    {
+        // write the IP address, subnet and gateway as 3 twenty byte blocks
+        fwrite(ipStr, 20, 1, fp);
+        fwrite(subnetStr, 20, 1, fp); 
+        fwrite(gatewayStr, 20, 1, fp); 
+
+        // close the file handle
+        fclose(fp);
+    }
+}
+
+
+    
+    
+
+                
+void processRcvBuffer(char *inBuff)
+{
+    int digits;
+    int octet1, octet2, octet3, octet4;
+    bool ipOk = false;
+    bool subnetOk = false;
+    bool gatewayOk = false;
+    char *cPtr = outBuff;
+    
+    switch (inBuff[0])
+    {
+        case 'r':                 // return temperature and humidity readings
+            
+            readSensor();
+            
+            // get temperature and humidity in a string            
+            sprintf( cPtr, "%5.1f\n%5.1f\n", currTemperature, currHumidity );
+
+            // send readings back to client
+            client.send_all(outBuff, strlen(outBuff));       
+            break;
+        case 'i':                 // could be id or ip
+            switch (inBuff[1])
+            {
+                case 'd':                         // flash a led to identify this device
+                    flashLedCnt = 10;
+                    break;
+                case 'p':                         // set the IP address to that contained in this packet
+                    // split packet up into seperate strings - ip add, subnet and gateway
+                    sscanf(inBuff, "ip %s\n%s\n%s", ipStr, subnetStr, gatewayStr);
+                    
+                    //pc.printf("ip %s\nSubnet %s\ngateway %s\n", ipStr, subnetStr, gatewayStr);
+                    
+                    // check if ip address valid
+                    digits = sscanf(ipStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+        
+                    if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+                        ipOk = true;
+
+                    //pc.printf("ip %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
+                    
+                    // check if subnet valid
+                    digits = sscanf(subnetStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+        
+                    //pc.printf("subnet %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
+
+                    if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+                        subnetOk = true;
+                    
+                    // check if gateway valid
+                    digits = sscanf(gatewayStr, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4);
+        
+                    //pc.printf("gateway %d.%d.%d.%d\n", octet1, octet2, octet3, octet4 );
+
+                    if (digits == 4 && octet1 >=0 && octet1 < 256 && octet2 >=0 && octet2 < 256 && octet3 >=0 && octet3 < 256 && octet4 >=0 && octet4 < 256)
+                        gatewayOk = true;
+
+                    // if all valid
+                    if (ipOk && subnetOk && gatewayOk)
+                    {
+                        //pc.printf("Changing IP settings\n");
+                        
+                        // save to config file
+                        writeConfigFile();
+                    }
+                    break;
+                default: ;
+            }
+            break;
+        default: 
+            break;
+    }
+}                    
+        
diff -r 000000000000 -r 4bbf12d35a8c mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#13a25134ac60
diff -r 000000000000 -r 4bbf12d35a8c mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri May 06 10:19:50 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/4fc01daae5a5
\ No newline at end of file