IoT Design with Cypress PSoC® 6 MCUs and Wi-Fi/Bluetooth using Arm® Mbed™
#
Lesson
GitHub Project
0
Introduction
1
Developer Resources
2
Your First Project & The Blinking Thread
https://github.com/iotexpert/mouser-mbed-02.git
3
Display Thread
https://github.com/iotexpert/mouser-mbed-03.git
4
Temperature Thread
https://github.com/iotexpert/mouser-mbed-04.git
5
CapSense Thread
https://github.com/iotexpert/mouser-mbed-05.git
6
WiFi & NTP Thread
https://github.com/iotexpert/mouser-mbed-06.git
7
The CY8CKIT-062-WiFi-BT
https://github.com/iotexpert/mouser-mbed-07.git
8
Amazon AWS MQTT Thread - Part1
https://github.com/iotexpert/mouser-mbed-08.git
9
Amazon AWS MQTT Thread - Part2
https://github.com/iotexpert/mouser-mbed-09.git
You can “mbed import https://github.com/iotexpert/mouser-mbed-09.git“ to make a copy of the project in your workspace.
The final architecture of the thermostat looks like this.
Summary
I don’t know about you guys, but it annoys me every time I see that the clock isn’t set. In this lesson we will start the IoT-ifying of this system by attaching it to WiFi and getting the network time.
Inside of the PSoC is a RealTime clock that is driven by the crystal oscillator on the board. However, “What time is it?” turns out to be a pretty simple question to answer if you are attached to the network. You find out using an NTP server. This lesson will attach to WiFi, and then every 5 minutes go get the UTC time from an NTP server.
To implement this I will
- Import lesson05
- Add the NTP Server Library
- Create & Code ntpThread.h
- Create & Code ntpThread.cpp
- Update main.cpp
- Build, Program and Test
Import lesson05
First import the Lesson 05 to create a new project.
https://github.com/iotexpert/mouser-mbed-05.git
Add the NTP Server Library
For this lesson I will use a library that knows how to talk to an NTP server using a TCP socket. To get this library click on the libraries tab and press “+”
Now provide the path to the library.
https://github.com/ARMmbed/ntp-client
Use the master branch:
Create & Code ntpThread.h
As always I am going to run the NTP Client in a thread. This thread will be called “ntpThread”:
There is nothing to this but the function definition:
#ifndef NTP_THREAD_H #define NTP_THREAD_H void ntpThread(); #endif
Create & Code ntpThread.cpp
Next create the actual thread code:
This code will need to include the ntp-client library. Then I do something semi-evil by making an external reference to the WiFiInterface which will be declared in main.cpp.
Finally I will poll the NTP server every 5 minutes. Notice that if the thing fails it tries again in 10 seconds. When I get the time I write it into the RTC using the standard-C set_time function. This function was connected by Cypress to the RTC hardware in the PSoC 6.
#include "mbed.h"
#include "ntp-client/NTPClient.h"
extern WiFiInterface *wifi;
void ntpThread()
{
NTPClient ntpclient(wifi);
uint32_t sleepTime = 1000 * 60 * 5 ; // 5 minutes
while(1)
{
if(wifi->get_connection_status() == NSAPI_STATUS_GLOBAL_UP)
{
time_t timestamp = ntpclient.get_timestamp();
if (timestamp < 0) {
sleepTime = 1000 * 10 ; // 10 seconds
}
else
{
set_time(timestamp);
sleepTime = 1000 * 60 * 5 ; // 5 minutes
}
}
ThisThread::sleep_for(sleepTime); // Goto the NTP server every 5 minutes
}
}
Update main.cpp
Now I need to update main.cpp. This time is a little bit different since I need to setup a connection to the WiFi network. I start by getting a pointer to the WiFi in the system and then connecting before I start all of the threads.
Notice that I hard-coded the SSID and Password. I also try again until I have a WiFi connection.
The rest of main.cpp is normal.
#include "mbed.h"
#include "blinkThread.h"
#include "displayThread.h"
#include "temperatureThread.h"
#include "capsenseThread.h"
#include "ntpThread.h"
Thread blinkThreadHandle;
Thread displayThreadHandle;
Thread temperatureThreadHandle;
Thread capsenseThreadHandle;
Thread ntpThreadHandle;
WiFiInterface *wifi;
int main()
{
printf("Started System\n");
int ret;
wifi = WiFiInterface::get_default_instance();
do {
ret = wifi->connect("CYFI_IOT_EXT", "cypresswicedwifi101", NSAPI_SECURITY_WPA_WPA2);
if (ret != 0) {
ThisThread::sleep_for(2000); // If for some reason it doesnt work wait 2s and try again
}
} while(ret !=0);
ntpThreadHandle.start(ntpThread);
blinkThreadHandle.start(blinkThread);
displayThreadHandle.start(displayThread);
temperatureThreadHandle.start(temperatureThread);
capsenseThreadHandle.start(capsenseThread);
}
Build, Program and Test
Now when I program this version, after 10 seconds or so, my time is updated… how cool is that?









2 Comments
Hi Alan
Which function prints wifi info when program starts:
https://i.postimg.cc/jSpFqSbk/wifi-demarrage.jpg
The WHD driver does that.
Alan