CITY3032-wifi-mqtt

main.cpp

Committer:
reedas
Date:
2021-11-13
Revision:
5:f62a9e4a499a
Parent:
3:62825c5f3cd7

File content as of revision 5:f62a9e4a499a:

/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 *
 * I2C Master code for Cypress PSoC 6 communicating with Arduino
 * =============================================================
 *
 * This module sets the PSoC 6 up as the master on the I2C bus
 * and periodically collects a set of environment data from an arduino
 * running the code below:
 */
//
// //I2C SLAVE CODE
// //I2C Communication between Two Arduino
// //CircuitDigest
// //Pramoth.T
//
// #include<Wire.h>                          //Library for I2C Communication // // functions
// #include <Adafruit_Sensor.h>
// #include <DHT.h>
// #include <DHT_U.h>
//
// #define DHTPIN 4     // Digital pin connected to the DHT sensor
// // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// // Pin 15 can work but DHT must be disconnected during program upload.
//
// // Uncomment the type of sensor in use:
// #define DHTTYPE    DHT11     // DHT 11
// //#define DHTTYPE    DHT22     // DHT 22 (AM2302)
// //#define DHTTYPE    DHT21     // DHT 21 (AM2301)
//
// // See guide for details on sensor wiring and usage:
// //   https://learn.adafruit.com/dht/overview
//
// DHT_Unified dht(DHTPIN, DHTTYPE);
//
// uint32_t delayMS;
// #include <PreciseLM35.h>
// #define TESTING false
//
// const int pinLM35 = A2;
// PreciseLM35 lm35(pinLM35, DEFAULT);
//
//
// unsigned char txDataPacket[10];
// unsigned char rxCommandPacket[8];
// unsigned char rxCommandNum;
// unsigned char rxCommand = 0;
// bool SW1Pressed = 0;
// bool SW2Pressed = 0;
//
// int blueLed = 13;
// int SW1Pin = 2;
// int SW2Pin = 3;
//
// void setup()
//
// {
//   pinMode(SW1Pin, INPUT);
//   pinMode(SW2Pin, INPUT);
//   pinMode(blueLed, OUTPUT);
//   dht.begin();
//   sensor_t sensor;
//   dht.temperature().getSensor(&sensor);
//   dht.humidity().getSensor(&sensor);
//   delayMS = sensor.min_delay / 1000;
//   Serial.begin(115200);                     //Begins Serial Communication at // 9600 baud rate
//   Wire.begin(8);                          //Begins I2C communication with // // Slave Address as 8 at pin (A4,A5)
//   Wire.onReceive(receiveEvent);           //Function call when Slave receives // value from master
//   Wire.onRequest(requestEvent);           //Function call when Master request // value from Slave
// }
//
// void loop(void)
// {
//   unsigned char SW1Debounced;
//   unsigned char SW2Debounced;
//   int temperature = 20;
//   while (1) {
//     if (rxCommandNum || TESTING) {
//
//
//       Serial.println("Slave Received Command From Master:");   //Prints in // // Serial Monitor
//       Serial.print(rxCommand);
//       Serial.print(" - ");
//       Serial.println(rxCommandNum);
//       for (int i = 0; i < 8; i++) {
//         Serial.print( rxCommandPacket[i] );
//         Serial.print( " - " );
//       }
//       Serial.println(" ");
//       for (int i = 0; i < 10; i++) {
//         Serial.print( txDataPacket[i] );
//         Serial.print( " - " );
//       }
//       Serial.println(" ");
//       rxCommandNum = 0;
//     }
//     sensors_event_t event;
//     int potvalue = map( analogRead(A0), 0, 1023, 0, 100);                   // // Reads analog value from POT (0-5V)
//     int lightlevel = map(analogRead(A1), 0, 1023, 0, 100);                  // // Ambient light level
//     int humidityInt = 101;
//     temperature = ((int)((lm35.readCelsius()) * 10));                   // // // Ambient Temperature
//     dht.humidity().getEvent(&event);
//     if (isnan(event.relative_humidity)) {
//       Serial.println(F("Error reading humidity!"));
//     }
//     else {
//       humidityInt = (int)event.relative_humidity;
//       Serial.print(F("Humidity: "));
//       Serial.print(humidityInt);
//       Serial.println(F("%"));
//     }
//     txDataPacket[0] = potvalue;
//     txDataPacket[1] = 0;   // or potvalue >> 8;
//     txDataPacket[2] = lightlevel;
//     txDataPacket[3] = 0; // or lightlevel >> 8;
//     txDataPacket[4] = temperature;
//     txDataPacket[5] = temperature >> 8;
//     SW1Debounced = (SW1Debounced << 1) | digitalRead(SW1Pin);
//     if (SW1Debounced == 0) SW1Pressed = 1;
//     SW2Debounced = (SW2Debounced << 1) | digitalRead(SW2Pin);
//     if (SW2Debounced == 0) SW2Pressed = 1;
//     txDataPacket[6] = SW1Pressed;
//     txDataPacket[7] = SW2Pressed;
//     txDataPacket[8] = humidityInt;
//     txDataPacket[9] = 0;
//     digitalWrite(blueLed, rxCommandPacket[1] & 1);
//     delay(delayMS);
//     if (TESTING) delay(2000);
//   }
// }
//
// void receiveEvent (int howMany)                    //This Function is called // when Slave receives value from master
// { for (int i = 0; i < howMany; i++) {
//     rxCommandPacket[i] = Wire.read();                    //Used to read value // received from master and store in variable SlaveReceived
//   }
//   rxCommandNum = howMany;
//   rxCommand = rxCommandPacket[0];
// }
// void requestEvent()                                //This Function is called when Master wants data from slave
// {
//   Wire.write(txDataPacket, 10);                          // sends eight bytes of data to master
//   SW1Pressed = 0;                                 // Clear key presses on send to master
//   SW2Pressed = 0;
// }

#include "mbed.h"
#include "platform/mbed_thread.h"
#include "GUI.h"
#include "cy8ckit_028_tft.h"

#define UNO_CMD (0x10) // Command byte to Uno
#define UNO_CMD_CONF (0x01) // Configuration data
#define UNO_ADDR     (0x10) // LM75 address

//I2C i2c(P8_1, P8_0);
I2C i2c(I2C_SDA, I2C_SCL);
DigitalOut myled(LED1);
#include <MQTTClientMbedOs.h>

//NetworkInterface* network;

//Serial pc(SERIAL_TX, SERIAL_RX);
Serial          pc(USBTX, USBRX);

#define APP_INFO( x )                       pc.printf x

volatile char TempCelsiusDisplay[] = "+abc.d C";
int lastLightDisplay = 101;
int lthresh = 50;

int arrivedcount = 0;

void messageArrived(MQTT::MessageData& md)
{
//    char buf[80];
    MQTT::Message &message = md.message;
    APP_INFO(("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id));
    APP_INFO(("Payload %.*s\r\n", message.payloadlen, (char*)message.payload));
//         lthresh = stoi((string)message.payload);
//        }
    arrivedcount++;
    APP_INFO(("Arrived = %d\r\n",arrivedcount));
}
int main()
{

    char data_write[8];
    char data_read[10];
    char buffer[120];
    int rc;

    /* Initialise display */
    GUI_Init();
    GUI_Clear();

    APP_INFO(("Connecting to the network using Wifi...\r\n"));
//    network = NetworkInterface::get_default_instance();
    NetworkInterface *network = NetworkInterface::get_default_instance();

    nsapi_error_t net_status = -1;
    for (int tries = 0; tries < 10; tries++) {
        net_status = network->connect();
        if (net_status == NSAPI_ERROR_OK) {
            break;
        } else {
            APP_INFO(("Unable to connect to network. Retrying...\r\n"));
        }
    }

    if (net_status != NSAPI_ERROR_OK) {
        APP_INFO(("ERROR: Connecting to the network failed (%d)!\r\n", net_status));
//        return -1;
    }

    APP_INFO(("Connected to the network successfully. IP address: %s\n", network->get_ip_address()));
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.clientID.cstring = (char *)"my_thing";
    data.keepAliveInterval = 20;
    data.cleansession = 1;
    data.username.cstring = (char *)"";
    data.password.cstring = (char *)"";
//    char *host = "10.0.0.2";
    char *host = (char *)"192.168.1.174";
    int port = 1883;
    TCPSocket socket;
    MQTTClient client(&socket);
    socket.open(network);
    socket.connect(host, port);
    client.connect(data);
    MQTT::Message message;
    sprintf(buffer, "Hello World! from My Thang\r\n");
    message.qos = MQTT::QOS0;
    message.retained = false;
    message.dup = false;
    message.payload = (void*)buffer;
    message.payloadlen = strlen(buffer)+1;

    client.publish( "mytopic/announce", message);
    rc = client.subscribe("mytopic/lthresh", MQTT::QOS0, messageArrived);
    if (rc) APP_INFO(("Subscription Error %d", rc));
    else APP_INFO(("Subscribed to mytopic/lthresh"));

    sprintf(buffer, "%d",lthresh);
    message.payload = (void*)buffer;
    message.payloadlen = strlen(buffer)+1;
    client.publish("mytopic/lthresh", message);
    data_write[0] = UNO_CMD;
    data_write[1] = 0x08;

    GUI_SetFont(GUI_FONT_10_1);
    GUI_SetTextAlign(GUI_TA_LEFT);
    int status = i2c.write(UNO_ADDR, data_write, 2, 0);
//    if (status != 0) { // Error
//        GUI_DispStringAt("I2C Error", 0, 220);
//        pc.printf("I2C connect error\n");
//        while (1) {
//            myled = !myled;
//            ThisThread::sleep_for(200);
//        }
//    }
    pc.printf("I2C connected");
    GUI_SetFont(GUI_FONT_20B_1);
    GUI_DispStringAt("Data from Arduino", 0, 0);
    int lightDisplay;
    int potValue;
    int humidity;

    while (1) {

        // Read Arduino data
        data_write[0] = UNO_CMD;
        i2c.write(UNO_ADDR, data_write, 2, 1); // no stop
//       if (i2c.read(UNO_ADDR, data_read, 10, 0)) {
//           GUI_SetFont(GUI_FONT_10_1);
//           GUI_DispStringAt("I2C receive error  ", 0, 220);
//           pc.printf("I2C Rx Error\n");
//       } else
        {
            i2c.read(UNO_ADDR, data_read, 10, 0);
            for (int i; i < 10; i++) pc.printf("%2x - ", data_read[i]);
            pc.printf("\n");
            GUI_SetFont(GUI_FONT_10_1);
            sprintf(buffer, "I2c Data Received, IP address is: %s arrived %d", network->get_ip_address(), arrivedcount);
            GUI_DispStringAt(buffer, 0, 220);
            pc.printf("I2C Rx data recevied\n");

            // read eight bytes
            // pot value - msb-0, lsb-1
            // light level - msb-2, lsb-3
            // temperature - msb-4, lsb-5
            // sw1 state - 6 - 0-255 based on how long pressed
            // sw2 state - 7 - 0-255 based on how long pressed
            // Humidity - msb-9, lsb-8

            // Calculate temperature value in Celcius
            int tempval = (int)((int)data_read[5] << 8) | data_read[4];
            if (tempval < 0) {
                TempCelsiusDisplay[0] = '-';
            } else {
                TempCelsiusDisplay[0] = '+';
            }

            // Integer part
            TempCelsiusDisplay[1] = (tempval / 1000) + 0x30;
            TempCelsiusDisplay[2] = ((tempval % 1000) / 100) + 0x30;
            TempCelsiusDisplay[3] = ((tempval % 1000) % 100 / 10) + 0x30;
            TempCelsiusDisplay[5] = ((tempval % 1000) % 100 % 10) + 0x30;

            //Switches

            unsigned char SW1State = data_read[6];
            unsigned char SW2State = data_read[7];

            //light level
            lightDisplay = (int)((int)data_read[3] << 8) | data_read[2];

            //potentiometer value
            potValue = (int)((int)data_read[1] << 8) | data_read[0];

            // humidity value
            humidity = (int)((int)data_read[9] << 8) | data_read[8];

            // Display result
            pc.printf("temp = %s, Light is %3d%%, Hum is %3d%%%s%s\n", TempCelsiusDisplay, lightDisplay, humidity, SW1State?", SW1 pressed":"", SW2State?", SW2 pressed":"");

            sprintf(buffer,"Temp is %2dC \nLight Level is %2d%c \nPot Value is %2d%c \nHumidity is %2d%c \n%s \n%s ", tempval/10, lightDisplay, 0x25, potValue, 0x25, humidity, 0x25, SW1State?"SW1 Pressed ":"SW1 Released", SW2State?"SW2 Pressed ":"SW2 Released");
            GUI_SetFont(GUI_FONT_20_1);
            GUI_DispStringAt(buffer, 0, 40);
        }
        sprintf(buffer, "Light Level is %d\r\n", lightDisplay);
        message.payload = (void*)buffer;
        message.payloadlen = strlen(buffer)+1;

//        if (lightDisplay != lastLightDisplay) {
            client.publish( "mytopic/light", message);
            lastLightDisplay = lightDisplay;
//        }
        
        myled = !myled;
        data_write[1] = data_write[1] ^ 0x01;
        thread_sleep_for(1000);
    }

}