ifocus smart light sample v0.9
Dependencies: MbedJSONValue MQTT
main.cpp
- Committer:
- zixuanlim
- Date:
- 2019-12-11
- Revision:
- 5:9b664d736a6a
- Parent:
- 4:dffb6c949dbf
- Child:
- 6:cd4d7e943f96
File content as of revision 5:9b664d736a6a:
#include "mbed.h" #include "TCPSocket.h" #include "MQTTNetwork.h" #include "MQTTmbed.h" #include "MQTTClient.h" #define WIFI_IDW0XX1 2 #define MQTTCLIENT_QOS2 1 #define RELAY_TIMEOUT 1 #if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH)) #include "ISM43362Interface.h" //ISM43362Interface _Wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false); ISM43362Interface _Wifi(false); // //#else // External WiFi modules // //#if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1 //#include "SpwfSAInterface.h" //SpwfSAInterface _Wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX); // //#endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1 #endif //WiFi LED region #define WIFI_LED_ON {_wifiLed.output(); _wifiLed = 1;_isWifiLedOn = 1;} #define WIFI_LED_OFF {_wifiLed.input(); _isWifiLedOn = 0;} DigitalOut _pirSensorLed(LED1); DigitalOut _relayLed(LED2); DigitalInOut _wifiLed(LED3); DigitalOut _relay1(D7); InterruptIn _motionTrigger(D2); Thread _dioManagerThread; Thread _wifiManagerThread; int _currentRelayTimeout = RELAY_TIMEOUT; typedef enum ServerConnectivity { Disconnected, Connected }ServerConnectivity; ServerConnectivity _brokerConnection; ServerConnectivity _pelionConnection; Timer _resetRelayTimer; bool _isRelayTriggered = false; bool _isWifiConnected = false; int _isWifiLedOn = 0; void OnRelay() { //_relayLed = 1; _relay1 = 1; _isRelayTriggered = true; } void OffRelay() { if(!_pirSensorLed) { //_relayLed = 0; _relay1 = 0; _isRelayTriggered = false; _resetRelayTimer.stop(); } else { _resetRelayTimer.reset(); } } void OnTrigger() { _pirSensorLed = 1; _resetRelayTimer.reset(); if(!_isRelayTriggered) { OnRelay(); _resetRelayTimer.start(); } } void OffTrigger() { _pirSensorLed = 0; //When no more motion trigger, off the PIR LED } void HandlePIR() { _motionTrigger.rise(&OnTrigger); _motionTrigger.fall(&OffTrigger); while(true) { if(_isRelayTriggered) //If relay is triggering { if(_resetRelayTimer.read() > _currentRelayTimeout) //Read Timer, if timer read above target time { OffRelay(); //Turn off the relay } } thread_sleep_for(500); } } void ConnectWifi() { do { if(!_isWifiConnected) { _Wifi.disconnect(); int ret = 0; do { ret = _Wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2); if(ret != 0) { thread_sleep_for(500); } }while(ret != 0); //Connected to WiFi interface or WIFI? //Start connectivity } else { _relayLed = !_relayLed; } thread_sleep_for(500); }while(true); } void status_callback(nsapi_event_t status, intptr_t param) { if (status == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) { switch(param) { case NSAPI_STATUS_GLOBAL_UP: { _isWifiConnected = true; _currentRelayTimeout = 10; //ZXLIM - Assume connected to broker and control by broker WIFI_LED_ON; break; } default: { _isWifiConnected = false; //ZXLIM - Ignore connected LAN 1st. _currentRelayTimeout = 1; break; } } } } int main() { _dioManagerThread.start(callback(HandlePIR)); _Wifi.attach(&status_callback); _wifiManagerThread.start(callback(ConnectWifi)); while(true) { while(!_isWifiConnected) { if(!_isWifiLedOn) { WIFI_LED_ON; } else { WIFI_LED_OFF; } thread_sleep_for(100); } thread_sleep_for(500); } }