soc-2

Dependencies:   PinDetect libmDot mbed-rtos mbed

Fork of thermostat_fan_demo--sensor by Multi-Hackers

main.cpp

Committer:
socie123
Date:
2015-10-24
Revision:
5:838b35b0a3c3
Parent:
3:d55b476ea5e6

File content as of revision 5:838b35b0a3c3:

// ---------------------------------------------
// MultiTech Thermostat & Fan Demo (Sensor unit)
//
// This program runs on a MultiTech mDot with:
//   - 1 MultiTech UDK
//   - 1 Arduino base shield
//   - 2 Grove COM08211P push buttons
//   - 1 Grove SEN23292P v1.2 temperature sensor
// ---------------------------------------------

#include "mbed.h"
#include "mDot.h"
#include "PinDetect.h"

mDot* dot;
//Ticker ledTick;
//Ticker temperatureMonitorTick;
Ticker periodicSendTick;

//PinDetect up_button(PB_1);        //A0 on Arduino base shield
//PinDetect down_button(PB_0);      //A1 on Arduino base shield
AnalogIn temperatureSensor(PC_1); //A2 on Arduino base shield
//DigitalOut transmitLED(LED1);     
//DigitalOut buttonPressLED(PA_1);  //D6 on Arduino base shield

// Configuration variables
static std::string config_network_name = "watchlink";
static std::string config_network_pass = "watchlink";
static uint8_t config_frequency_sub_band = 1;

//Global Variables
//static uint16_t setPoint = 21;       //21 C is standard room temp
static volatile bool timeToReadTemperature = true;
static volatile bool dataChanged = true;
//static volatile bool thermostatActivated = false;
//static uint16_t sentSetPoint;

//Function prototypes
//void ledTock();
void periodicSendTock();
//void temperatureMonitorTock();
//void up_button_callback();
//void down_button_callback();
void printError(mDot* dot, int32_t returnCode);
void printVersion();
bool setFrequencySubBand(uint8_t subBand);
bool setNetworkName(const std::string name);
bool setNetworkPassphrase(const std::string passphrase);
bool setPower(uint8_t power);
bool setAck(uint8_t retries);
bool joinNetwork();
bool send(const std::string text);


int main()
{
    //Start LED startup sequence
    //ledTick.attach(&ledTock, 0.1);

    printf("\r\n\r\n");
    printf("=====================================\r\n");
    printf("MTS Thermostat/Fan Demo (Sensor unit)\r\n");
    printf("=====================================\r\n");
    printVersion();

    // get the mDot handle
    dot = mDot::getInstance();

    // reset to default config so we know what state we're in
    dot->resetNetworkSession();
    dot->resetConfig();

    // set up the mDot with our network information
    setNetworkName(config_network_name);
    setNetworkPassphrase(config_network_pass);
    setFrequencySubBand(config_frequency_sub_band);
    setPower(7);    // Reduce latency for 868 units
    setAck(0);      // Disable ack for less latency

    while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); }

    //Stop LED startup sequence & configure them for operation
    //ledTick.detach();
    //transmitLED = 1;
    //buttonPressLED = 1;

    // Configure timers
    periodicSendTick.attach(&periodicSendTock, 1*60);
    //temperatureMonitorTick.attach(&temperatureMonitorTock, 0.15);

    // Setup Interrupt callback function
    //up_button.attach_deasserted(&up_button_callback);
    //down_button.attach_deasserted(&down_button_callback);

    // Start sampling buttons using interrupts
    //up_button.setSampleFrequency();
    //down_button.setSampleFrequency();

    uint16_t temperature = 0;
    //while (1) {
        //if (timeToReadTemperature) {
            uint16_t B = 4100;            //B value of the thermistor
            uint16_t analogReading;
            float resistance;

            analogReading = temperatureSensor.read_u16();

            // get the resistance of the sensor
            resistance=(65534-analogReading)*10000/analogReading;
            // convert to temperature via datasheet
            temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;
            //printf("read: %d, res: %d, temp: %d,set: %d\r\n", analogReading, (uint16_t)resistance, temperature, setPoint);

            //if (!thermostatActivated && temperature > setPoint) {
                //thermostatActivated = true;
                //dataChanged = true;
            //}
            //else if (thermostatActivated && temperature < setPoint) {
                //thermostatActivated = false;
                //dataChanged = true;
            //}

            //timeToReadTemperature = false;
        //}
        
        dataChanged = true;

        
        if (dataChanged) {
            
            char latestData[100];
            //transmitLED = 1;
           // sentSetPoint = setPoint;
            sprintf(latestData, "temp: %d", temperature);
            printf("%s\r\n", latestData);

            if (send(latestData)) {
                dataChanged = false;
            }
            //transmitLED = 0;
        }
    //}
 //return true;   
}

void printVersion()
{
    printf("%s\r\n\r\n", dot->getId().c_str());
}

void periodicSendTock() {
    dataChanged = true;
}

bool setFrequencySubBand(uint8_t subBand)
{
    int32_t returnCode;
    printf("Setting frequency sub band to '%d'...\r\n", subBand);
    if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) {
        printError(dot, returnCode);
        return false;
    }
    return true;
}

bool setNetworkName(const std::string name)
{
    int32_t returnCode;
    printf("Setting network name to '%s'...\r\n", name.c_str());
    if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK)
    {
        printError(dot, returnCode);
        return false;
    }
    return true;
}

bool setNetworkPassphrase(const std::string passphrase)
{
    int32_t returnCode;
    printf("Setting passphrase to '%s'...\r\n", passphrase.c_str());
    if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK)
    {
        printError(dot, returnCode);
        return false;
    }
    return true;
}

bool setPower(uint8_t power)
{
    int32_t returnCode;
    printf("Setting tx power to '%d'...\r\n", power);
    if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) {
        printError(dot, returnCode);
        return false;
    }
    return true;
}


bool joinNetwork()
{
    int32_t returnCode;
    printf("\r\nJoining network...\r\n");
    if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) {
        printError(dot, returnCode);
        return false;
    }
    printf("Network Joined!\r\n");
    return true;
}

bool setAck(uint8_t retries)
{
    int32_t returnCode;
    printf("Setting ack to '%d'...\r\n", retries);
    if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK)
    {
        printError(dot, returnCode);
        return false;
    }
    return true;
}

bool send(const std::string text)
{
    int32_t returnCode;
    uint32_t timeTillSend = dot->getNextTxMs();
    if (timeTillSend != 0) {
        printf("waiting %lu ms to send\r\n", timeTillSend);
        return false;
    }

    printf("Sending data...  ");
    std::vector<uint8_t> data(text.begin(), text.end());
    if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK)
    {
        printError(dot, returnCode);
        return false;
    }
    printf("Data sent!\r\n");
    return true;
}

void printError(mDot* dot, int32_t returnCode)
{
    std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError();
    printf("%s\r\n", error.c_str());
 }