Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- vikshin
- Date:
- 2020-02-13
- Revision:
- 1:0a30ef7e2613
- Parent:
- 0:3e84b0310c96
File content as of revision 1:0a30ef7e2613:
/* mbed Example Program
* Copyright (c) 2006-2014 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed.h"
#include "Dht11.h"
// ----------------------------------------------------------------------------------------------------
// Define
// ----------------------------------------------------------------------------------------------------
/* Default setting */
#define ON 1
#define OFF 0
#define ENABLE 1
#define DISABLE 0
#define RET_OK 1
#define RET_NOK -1
/* Pin configuraiton */
#define MBED_CONF_WIZFI360_TX D8
#define MBED_CONF_WIZFI360_RX D2
#define MBED_CONF_WIZFI360_RESET D9
#define MBED_CONF_WIZFI360_SENSOR_CDS A0
#define MBED_CONF_WIZFI360_SENSOR_DHT D14
/* Serial setting */
#define WIZFI360_DEFAULT_BAUD_RATE 115200
/* Parser setting */
#define WIZFI360_PARSER_DELIMITER "\r\n"
/* Debug message setting */
#define DEBUG_ENABLE 1
#define DEBUG_DISABLE 0
#define WIZFI360_PARSER_DEBUG DEBUG_DISABLE
/* Timeout setting */
#define WIZFI360_DEFAULT_TIMEOUT 1000
/* Wi-Fi */
#define STATION 1
#define SOFTAP 2
#define STATION_SOFTAP 3
#define WIFI_MODE STATION
// ----------------------------------------------------------------------------------------------------
// Variables
// ----------------------------------------------------------------------------------------------------
Serial pc(USBTX, USBRX);
UARTSerial *_serial;
ATCmdParser *_parser;
DigitalOut _RESET_WIZFI360(MBED_CONF_WIZFI360_RESET);
AnalogIn _cdsVal(MBED_CONF_WIZFI360_SENSOR_CDS);
Dht11 _dhtVal(MBED_CONF_WIZFI360_SENSOR_DHT);
/* Sensor info */
struct sensor
{
int ill; // illuminance
int cel; // celsius
float fah; // fahrenheit
int hum; // humidity
};
/* WiFi info */
char ssid[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
char password[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
/* MQTT info */
char hub_name[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
char device_id[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
char device_primary_key[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
// ----------------------------------------------------------------------------------------------------
// Functions
// ----------------------------------------------------------------------------------------------------
/* Util */
void delay(int ms);
/* Serial */
void serialPcInit(void);
void serialDeviceInit(PinName tx, PinName rx, int baudrate);
void serialAtParserInit(const char *delimiter, bool debug_en);
/* Device */
void deviceInit_WizFi360(void);
void deviceReset_WizFi360(void);
void deviceIsReady_WizFi360(void);
/* Sensor */
int deviceGetIllVal_WizFi360(void);
int deviceGetCelVal_WizFi360(void);
float deviceGetFahVal_WizFi360(void);
int deviceGetHumVal_WizFi360(void);
/* Wi-Fi */
int8_t deviceSetWifiMode_WizFi360(int mode);
int8_t deviceSetDhcp_WizFi360(int mode, int en_dhcp);
int8_t deviceConnAP_WizFi360(int mode, char *ssid, char *password);
/* Azure */
int8_t deviceSetAzureConf_WizFi360(char *iot_hub, char *device_id, char *sas_token);
int8_t devicePublishMsg_WizFi360(char *device_id, sensor *sensor_info);
int8_t deviceAzureCon_WizFi360();
int8_t deviceSetTopic_WizFi360(char *device_id);
// ----------------------------------------------------------------------------------------------------
// Main
// ----------------------------------------------------------------------------------------------------
int main()
{
sensor sensor_info;
/* Set serial */
serialPcInit();
/* Set device */
deviceInit_WizFi360();
deviceReset_WizFi360();
deviceIsReady_WizFi360();
/* Set Wi-Fi */
deviceSetWifiMode_WizFi360(WIFI_MODE);
deviceSetDhcp_WizFi360(WIFI_MODE, ENABLE);
deviceConnAP_WizFi360(WIFI_MODE, ssid, password);
/* Set Azure */
deviceSetAzureConf_WizFi360(hub_name,device_id,device_primary_key);
deviceSetTopic_WizFi360(device_id);
deviceAzureCon_WizFi360();
while(true)
{
/* Get sensor info */
sensor_info.ill = deviceGetIllVal_WizFi360();
sensor_info.cel = deviceGetCelVal_WizFi360();
sensor_info.fah = deviceGetFahVal_WizFi360();
sensor_info.hum = deviceGetHumVal_WizFi360();
/* Publish message */
devicePublishMsg_WizFi360(device_id, &sensor_info);
delay(3000);
}
}
// ----------------------------------------------------------------------------------------------------
// Functions : Util
// ----------------------------------------------------------------------------------------------------
void delay(int ms)
{
wait_us(ms * 1000);
}
// ----------------------------------------------------------------------------------------------------
// Functions : Serial
// ----------------------------------------------------------------------------------------------------
void serialPcInit(void)
{
pc.baud(115200);
pc.format(8, Serial::None, 1);
}
void serialDeviceInit(PinName tx, PinName rx, int baudrate)
{
_serial = new UARTSerial(tx, rx, baudrate);
}
void serialAtParserInit(const char *delimiter, bool debug_en)
{
_parser = new ATCmdParser(_serial);
_parser->debug_on(debug_en);
_parser->set_delimiter(delimiter);
_parser->set_timeout(WIZFI360_DEFAULT_TIMEOUT);
}
// ----------------------------------------------------------------------------------------------------
// Functions : Device
// ----------------------------------------------------------------------------------------------------
void deviceInit_WizFi360(void)
{
serialDeviceInit(MBED_CONF_WIZFI360_TX, MBED_CONF_WIZFI360_RX, WIZFI360_DEFAULT_BAUD_RATE);
serialAtParserInit(WIZFI360_PARSER_DELIMITER, WIZFI360_PARSER_DEBUG);
}
void deviceReset_WizFi360(void)
{
_RESET_WIZFI360 = 1;
delay(300);
_RESET_WIZFI360 = 0;
delay(400);
_RESET_WIZFI360 = 1;
delay(1000);
}
void deviceIsReady_WizFi360(void)
{
while(1)
{
if(_parser->recv("ready"))
{
pc.printf("WizFi360 is available\r\n");
return;
}
else if(_parser->send("AT") && _parser->recv("OK"))
{
pc.printf("WizFi360 is already available\r\n");
return;
}
else
{
pc.printf("WizFi360 is not available\r\n");
return;
}
}
}
// ----------------------------------------------------------------------------------------------------
// Functions : Sensor
// ----------------------------------------------------------------------------------------------------
/* illuminance */
int deviceGetIllVal_WizFi360(void)
{
int val = _cdsVal.read_u16() / 100;
return val;
}
/* celsius */
int deviceGetCelVal_WizFi360(void)
{
_dhtVal.read();
int val = _dhtVal.getCelsius();
return val;
}
/* fahrenheit */
float deviceGetFahVal_WizFi360(void)
{
_dhtVal.read();
int val = _dhtVal.getFahrenheit();
return val;
}
/* humidity */
int deviceGetHumVal_WizFi360(void)
{
_dhtVal.read();
int val = _dhtVal.getHumidity();
return val;
}
// ----------------------------------------------------------------------------------------------------
// Functions : Wi-Fi
// ----------------------------------------------------------------------------------------------------
int8_t deviceSetWifiMode_WizFi360(int mode)
{
int8_t ret = RET_NOK;
if(_parser->send("AT+CWMODE_CUR=%d", mode) && _parser->recv("OK"))
{
pc.printf("Set Wi-Fi mode : %d\r\n", mode);
ret = RET_OK;
}
else
{
pc.printf("Set Wi-Fi mode : ERROR\r\n");
}
return ret;
}
int8_t deviceSetDhcp_WizFi360(int mode, int en_dhcp)
{
int8_t ret = RET_NOK;
int mode_dhcp;
if(mode == STATION)
{
mode_dhcp = 1;
}
else if(mode == SOFTAP)
{
mode_dhcp = 0;
}
else if(mode == STATION_SOFTAP)
{
mode_dhcp = 2;
}
else
{
pc.printf("Set DHCP : ERROR\r\n");
}
if(_parser->send("AT+CWDHCP_CUR=%d,%d", mode_dhcp, en_dhcp) && _parser->recv("OK"))
{
pc.printf("Set DHCP : %d, %d\r\n", mode_dhcp, en_dhcp);
ret = RET_OK;
}
else
{
pc.printf("Set DHCP : ERROR\r\n");
}
return ret;
}
int8_t deviceConnAP_WizFi360(int mode, char *ssid, char *password)
{
int8_t ret = RET_NOK;
bool done = false;
Timer t;
if((mode == STATION) || (mode == STATION_SOFTAP))
{
_parser->send("AT+CWJAP_CUR=\"%s\",\"%s\"", ssid ,password);
t.start();
while(done != true)
{
done = (_parser->recv("WIFI CONNECTED") && _parser->recv("WIFI GOT IP") && _parser->recv("OK"));
if(t.read_ms() >= (WIZFI360_DEFAULT_TIMEOUT * 20))
{
t.stop();
t.reset();
break;
}
}
if(done)
{
pc.printf("Connect AP : %s, %s\r\n", ssid, password);
ret = RET_OK;
}
else
{
pc.printf("Connect AP : ERROR\r\n");
}
}
else
{
pc.printf("Connect AP : ERROR\r\n");
}
return ret;
}
// ----------------------------------------------------------------------------------------------------
// Functions : Azure
// ----------------------------------------------------------------------------------------------------
int8_t deviceSetAzureConf_WizFi360(char *iot_hub, char *device_id, char *sas_token)
{
int8_t ret = RET_NOK;
if(_parser->send("AT+AZSET=\"%s\",\"%s\",\"%s\"", iot_hub, device_id, sas_token) && _parser->recv("OK"))
{
pc.printf("Azure Set configuration : %s, %s, %s\r\n", iot_hub, device_id, sas_token);
ret = RET_OK;
}
else
{
pc.printf("Azure Set configuration : ERROR\r\n");
}
return ret;
}
int8_t deviceSetTopic_WizFi360(char *device_id)
{
int8_t ret = RET_NOK;
if(_parser->send("AT+MQTTTOPIC=\"devices/%s/messages/events/\",\"devices/%s/messages/devicebound/#\"", device_id, device_id) && _parser->recv("OK"))
{
pc.printf("Set topic : %s\r\n", device_id);
ret = RET_OK;
}
else
{
pc.printf("Set topic : ERROR\r\n");
}
return ret;
}
int8_t deviceAzureCon_WizFi360()
{
int8_t ret = RET_NOK;
bool done = false;
Timer t;
_parser->send("AT+AZCON");
t.start();
while(done != true)
{
done = (_parser->recv("CONNECT") && _parser->recv("OK"));
if(t.read_ms() >= (WIZFI360_DEFAULT_TIMEOUT * 3))
{
t.stop();
t.reset();
break;
}
}
if(done)
{
pc.printf("Connected to Azure successfully\r\n");
ret = RET_OK;
}
else
{
pc.printf("Connection to Azure failed: ERROR\r\n");
}
return ret;
}
int8_t devicePublishMsg_WizFi360(char *device_id, sensor *sensor_info)
{
int8_t ret = RET_NOK;
if(_parser->send("AT+MQTTPUB=\"{\"deviceId\":\"%s\",\"temperature\":%d,\"humidity\":%d}\"",device_id, sensor_info->cel, sensor_info->hum))
{
pc.printf("Publish message : %d, %d\r\n", sensor_info->cel, sensor_info->hum);
}
return ret;
}