NTP demo for cypress Pioneer and Proto Dev kits also reads available analogue sensors

Revision:
0:01c8e1277c91
Child:
1:352a27b3a1ec
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jul 01 16:01:27 2020 +0100
@@ -0,0 +1,263 @@
+#include "mbed.h"
+#include "GUI.h"
+#include "mbed_events.h"
+#include "ntp-client/NTPClient.h"
+
+#define CY8CKIT_TFT // Light or Temperature?
+Thread netTimeThreadHandle;
+WiFiInterface *wifi;
+#define MBED_CONF_APP_WIFI_SSID "brackenhillc"
+#define MBED_CONF_APP_WIFI_PASSWORD "1broches"
+
+/* Reference resistor in series with the thermistor is of 10 KOhm */
+#define R_REFERENCE (float)(10000)
+
+/* Beta constant of this thermistor is 3380 Kelvin. See the thermistor
+   (NCP18XH103F03RB) data sheet for more details. */
+#define B_CONSTANT (float)(3380)
+
+/* Resistance of the thermistor is 10K at 25 degrees C (from data sheet)
+   Therefore R0 = 10000 Ohm, and T0 = 298.15 Kelvin, which gives
+   R_INFINITY = R0 e^(-B_CONSTANT / T0) = 0.1192855 */
+#define R_INFINITY (float)(0.1192855)
+
+/* Zero Kelvin in degree C */
+#define ABSOLUTE_ZERO (float)(-273.15)
+
+EventQueue *displayQueue;
+Semaphore WiFiSemaphore;
+#define SENSOR_BOARD
+#ifdef CY8CKIT_TFT
+DigitalOut      PwrEnable(P6_2);
+#ifdef SENSOR_BOARD
+AnalogIn        ALS(P10_7); //Sensor Board
+#else
+AnalogIn        ALS(P10_0); //TFT Board
+#endif
+static float lightlevel;
+#else
+DigitalOut      PwrEnable(P10_0);
+DigitalOut      ThermGnd(P10_3);
+AnalogIn        Thermistor(P10_1);
+static float TempAverage;
+#endif
+/******************************************************************************************
+*
+* Display Functions
+*
+********************************************************************************************/
+#define DISP_LEFTMARGIN 10
+#define DISP_TOPMARGIN 4
+#define DISP_LINESPACE 2
+// updateDisplayWiFiStatus
+// Used to display the wifi status
+void updateDisplayWiFiStatus(char *status)
+{
+    GUI_SetFont(GUI_FONT_16_1);
+    GUI_DispStringAt(status,DISP_LEFTMARGIN, DISP_TOPMARGIN);
+    free(status);
+}
+// updateDisplayWiFiConnectAttempts
+// This function displays the number of attempted connections
+void updateDisplayWiFiConnectAttempts(int count)
+{
+    char buffer[128];
+    snprintf(buffer,sizeof(buffer),"WiFi Connect Attempts = %d",count);
+    GUI_SetFont(GUI_FONT_16_1);
+    GUI_DispStringAt(buffer,DISP_LEFTMARGIN, DISP_TOPMARGIN + (GUI_GetFontSizeY()+DISP_LINESPACE) );
+}
+// updateDisplayNTPFailed
+// updates the display with the number of time the NTP Server has been called
+// and got a failed response
+void updateDisplayNTPFailed(void)
+{
+    static int count=0;
+    char buffer[128];
+    count = count + 1;
+    snprintf(buffer,sizeof(buffer),"NTP Update Failure = %d\n",count);
+    GUI_SetFont(GUI_FONT_16_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize() - 2*GUI_GetFontSizeY()); // near the bottom
+}
+// updateDisplayNTPCount
+// updates the display with the number of time the NTP Server has been called
+void updateDisplayNTPCount(void)
+{
+    static int count=0;
+    char buffer[128];
+    count = count + 1;
+    snprintf(buffer,sizeof(buffer),"NTP Updates = %d\n",count);
+    GUI_SetFont(GUI_FONT_16_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize() - GUI_GetFontSizeY()); // near the bottom
+}
+// updateDisplayTime
+// This function updates the time on the screen
+void updateDisplayTime()
+{
+    time_t rawtime;
+    struct tm * timeinfo;
+    char buffer [128];
+    time (&rawtime);
+    //rawtime = rawtime - (4*60*60); // UTC - 4hours ... serious hack which only works in summer
+    rawtime = rawtime + 3600;  // GMT + 1 for BST
+    timeinfo = localtime (&rawtime);
+    strftime (buffer,sizeof(buffer)," %R ",timeinfo);
+    GUI_SetFont(GUI_FONT_32B_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 - 20);
+    printf("%s\r\n", buffer);
+    strftime (buffer,sizeof(buffer)," %A   ",timeinfo);
+    GUI_SetFont(GUI_FONT_32B_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 + 20);
+    printf("%s\r\n", buffer);
+    strftime (buffer,sizeof(buffer)," %D ",timeinfo);
+    GUI_SetFont(GUI_FONT_32B_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 + 60);
+    printf("%s\r\n", buffer);
+#ifdef CY8CKIT_TFT
+    sprintf(buffer, " Light = %d %c  \r\n",int(lightlevel*100), '%');
+                            GUI_SetFont(GUI_FONT_32B_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 - 60);
+    printf("%s",buffer);
+#else
+    float temperature = (B_CONSTANT / (logf((R_REFERENCE / ( 1 / TempAverage - 1 )) / 
+                                               R_INFINITY))) + ABSOLUTE_ZERO;
+
+    sprintf(buffer, "Temperature = %d.%1d C\r\n",int(temperature),
+                        int((temperature-(int)temperature)*10));
+                            GUI_SetFont(GUI_FONT_32B_1);
+    GUI_DispStringHCenterAt(buffer,LCD_GetXSize()/2,LCD_GetYSize()/2 - GUI_GetFontSizeY()/2 - 60);
+    printf("%s",buffer);
+#endif
+    printf("%c[4A", 0x1b );
+}
+void readSensors(){
+    PwrEnable = 1;
+#ifdef CY8CKIT_TFT
+    static int lcount = 0;
+    static float Light[8];
+    Light[lcount] = ALS;
+    lcount = (lcount + 1) & 0x7;
+    if (lcount == 0) {
+    lightlevel = 0;
+        for (int i = 0; i < 8; i++) lightlevel += Light[i];
+        lightlevel = lightlevel/8;
+#ifdef SENSOR_BOARD
+        lightlevel = 1 - lightlevel;
+#endif        
+#else
+    ThermGnd = 0;
+    static int lcount = 0;
+    static float Therm[8];
+    float thermValue;
+    float rThermistor;
+    thermValue = Thermistor;
+    Therm[lcount] = thermValue;
+    lcount = (lcount + 1) & 0x7;
+    if (lcount == 0) {
+        TempAverage = 0;
+        for (int i = 0; i < 8; i++) TempAverage += Therm[i];
+        TempAverage = TempAverage/8;
+/*        rThermistor = (R_REFERENCE/(1 / TempAverage -1 ));
+ *       temperature =
+ *         (B_CONSTANT / (logf(rThermistor / R_INFINITY))) + ABSOLUTE_ZERO;
+ * 
+ *       temperature = (B_CONSTANT / (logf((R_REFERENCE / ( 1 / TempAverage - 1 )) / 
+ *                                                   R_INFINITY))) + ABSOLUTE_ZERO;
+ *
+ *        printf("Temp is %d\r\n",(int)(temperature*10));
+ *        for (int i = 0; i < 8; i++) 
+ *            printf("%d ", (int)(Therm[i]*1000));
+ *        printf("therm=%d\r\n", (int)(thermValue*1000));
+ */
+
+#endif
+    PwrEnable = 0;
+   }
+}
+/******************************************************************************************
+* NTPTimeThread
+* This thread calls the NTP Timeserver to get the UTC time
+* It then updates the time in the RTC
+* And it updates the display by adding an event to the display queue
+********************************************************************************************/
+void NTPTimeThread()
+{
+    static time_t old_timestamp = 0, timestamp;
+    NTPClient ntpclient(wifi);
+    while(1) {
+        if(wifi->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
+            timestamp = ntpclient.get_timestamp();
+            if (timestamp < old_timestamp) {
+                displayQueue->call(updateDisplayNTPFailed);
+            } else {
+                set_time(timestamp);
+                displayQueue->call(updateDisplayNTPCount);
+            }
+        }
+        old_timestamp = timestamp;
+        ThisThread::sleep_for(300s); // Goto the NTP server every 5 minutes
+    }
+}
+/******************************************************************************************
+*
+* Main & WiFi Thread
+*
+********************************************************************************************/
+// wifiStatusCallback
+// Changes the display when the wifi status is changed
+void wifiStatusCallback(nsapi_event_t status, intptr_t param)
+{
+    const int buffSize=40;
+    char *statusText;
+    SocketAddress a;
+    statusText = (char *)malloc(buffSize);
+    switch(param) {
+        case NSAPI_STATUS_LOCAL_UP:
+            wifi->get_ip_address(&a);
+            snprintf(statusText,buffSize,"WiFi IP = %s",a.get_ip_address());
+            break;
+        case NSAPI_STATUS_GLOBAL_UP:
+            wifi->get_ip_address(&a);
+            snprintf(statusText,buffSize,"WiFi IP = %s",a.get_ip_address());
+            break;
+        case NSAPI_STATUS_DISCONNECTED:
+            WiFiSemaphore.release();
+            snprintf(statusText,buffSize,"WiFi Disconnected");
+            break;
+        case NSAPI_STATUS_CONNECTING:
+            snprintf(statusText,buffSize,"WiFi Connecting");
+            break;
+        default:
+            snprintf(statusText,buffSize,"Not Supported");
+            break;
+    }
+    displayQueue->call(updateDisplayWiFiStatus,statusText);
+}
+int main()
+{
+    int wifiConnectionAttempts;
+    int ret;
+    GUI_Init();
+    printf("%c[2J", 0x1b);   // Clear Screen
+    printf("%c[?25l", 0x1b); // Cursor Off
+    displayQueue = mbed_event_queue();
+    displayQueue->call_every(1s, &updateDisplayTime);
+    displayQueue->call_every(100ms, &readSensors);
+    wifi = WiFiInterface::get_default_instance();
+    wifi->attach(&wifiStatusCallback);
+
+    while(1) {
+        wifiConnectionAttempts = 1;
+        do {
+            ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
+            displayQueue->call(updateDisplayWiFiConnectAttempts,wifiConnectionAttempts);
+            if (ret != 0) {
+                wifiConnectionAttempts += 1;
+                ThisThread::sleep_for(2s); // If for some reason it doesnt work wait 2s and try again
+            }
+        } while(ret !=0);
+// If the NTPThread is not running... then start it up
+        if(netTimeThreadHandle.get_state() == Thread::Deleted)
+            netTimeThreadHandle.start(NTPTimeThread);
+        WiFiSemaphore.acquire();
+    }
+}
\ No newline at end of file