Andrew Reed
/
CITY1082-i2c_master_wifi_mqtt
CITY3032-wifi-mqtt
main.cpp@5:f62a9e4a499a, 2021-11-13 (annotated)
- Committer:
- reedas
- Date:
- Sat Nov 13 12:02:49 2021 +0000
- Revision:
- 5:f62a9e4a499a
- Parent:
- 3:62825c5f3cd7
trying to include mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
reedas | 0:e9613d017b5e | 1 | /* mbed Microcontroller Library |
reedas | 0:e9613d017b5e | 2 | * Copyright (c) 2019 ARM Limited |
reedas | 0:e9613d017b5e | 3 | * SPDX-License-Identifier: Apache-2.0 |
reedas | 0:e9613d017b5e | 4 | * |
reedas | 0:e9613d017b5e | 5 | * I2C Master code for Cypress PSoC 6 communicating with Arduino |
reedas | 0:e9613d017b5e | 6 | * ============================================================= |
reedas | 0:e9613d017b5e | 7 | * |
reedas | 0:e9613d017b5e | 8 | * This module sets the PSoC 6 up as the master on the I2C bus |
reedas | 0:e9613d017b5e | 9 | * and periodically collects a set of environment data from an arduino |
reedas | 0:e9613d017b5e | 10 | * running the code below: |
reedas | 3:62825c5f3cd7 | 11 | */ |
reedas | 3:62825c5f3cd7 | 12 | // |
reedas | 2:3dabedbecf5e | 13 | // //I2C SLAVE CODE |
reedas | 2:3dabedbecf5e | 14 | // //I2C Communication between Two Arduino |
reedas | 2:3dabedbecf5e | 15 | // //CircuitDigest |
reedas | 2:3dabedbecf5e | 16 | // //Pramoth.T |
reedas | 3:62825c5f3cd7 | 17 | // |
reedas | 2:3dabedbecf5e | 18 | // #include<Wire.h> //Library for I2C Communication // // functions |
reedas | 2:3dabedbecf5e | 19 | // #include <Adafruit_Sensor.h> |
reedas | 2:3dabedbecf5e | 20 | // #include <DHT.h> |
reedas | 2:3dabedbecf5e | 21 | // #include <DHT_U.h> |
reedas | 3:62825c5f3cd7 | 22 | // |
reedas | 3:62825c5f3cd7 | 23 | // #define DHTPIN 4 // Digital pin connected to the DHT sensor |
reedas | 2:3dabedbecf5e | 24 | // // Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- |
reedas | 2:3dabedbecf5e | 25 | // // Pin 15 can work but DHT must be disconnected during program upload. |
reedas | 3:62825c5f3cd7 | 26 | // |
reedas | 2:3dabedbecf5e | 27 | // // Uncomment the type of sensor in use: |
reedas | 2:3dabedbecf5e | 28 | // #define DHTTYPE DHT11 // DHT 11 |
reedas | 2:3dabedbecf5e | 29 | // //#define DHTTYPE DHT22 // DHT 22 (AM2302) |
reedas | 2:3dabedbecf5e | 30 | // //#define DHTTYPE DHT21 // DHT 21 (AM2301) |
reedas | 3:62825c5f3cd7 | 31 | // |
reedas | 2:3dabedbecf5e | 32 | // // See guide for details on sensor wiring and usage: |
reedas | 2:3dabedbecf5e | 33 | // // https://learn.adafruit.com/dht/overview |
reedas | 3:62825c5f3cd7 | 34 | // |
reedas | 2:3dabedbecf5e | 35 | // DHT_Unified dht(DHTPIN, DHTTYPE); |
reedas | 3:62825c5f3cd7 | 36 | // |
reedas | 2:3dabedbecf5e | 37 | // uint32_t delayMS; |
reedas | 2:3dabedbecf5e | 38 | // #include <PreciseLM35.h> |
reedas | 2:3dabedbecf5e | 39 | // #define TESTING false |
reedas | 3:62825c5f3cd7 | 40 | // |
reedas | 2:3dabedbecf5e | 41 | // const int pinLM35 = A2; |
reedas | 2:3dabedbecf5e | 42 | // PreciseLM35 lm35(pinLM35, DEFAULT); |
reedas | 3:62825c5f3cd7 | 43 | // |
reedas | 3:62825c5f3cd7 | 44 | // |
reedas | 2:3dabedbecf5e | 45 | // unsigned char txDataPacket[10]; |
reedas | 2:3dabedbecf5e | 46 | // unsigned char rxCommandPacket[8]; |
reedas | 2:3dabedbecf5e | 47 | // unsigned char rxCommandNum; |
reedas | 2:3dabedbecf5e | 48 | // unsigned char rxCommand = 0; |
reedas | 2:3dabedbecf5e | 49 | // bool SW1Pressed = 0; |
reedas | 2:3dabedbecf5e | 50 | // bool SW2Pressed = 0; |
reedas | 3:62825c5f3cd7 | 51 | // |
reedas | 2:3dabedbecf5e | 52 | // int blueLed = 13; |
reedas | 2:3dabedbecf5e | 53 | // int SW1Pin = 2; |
reedas | 2:3dabedbecf5e | 54 | // int SW2Pin = 3; |
reedas | 3:62825c5f3cd7 | 55 | // |
reedas | 2:3dabedbecf5e | 56 | // void setup() |
reedas | 3:62825c5f3cd7 | 57 | // |
reedas | 2:3dabedbecf5e | 58 | // { |
reedas | 2:3dabedbecf5e | 59 | // pinMode(SW1Pin, INPUT); |
reedas | 2:3dabedbecf5e | 60 | // pinMode(SW2Pin, INPUT); |
reedas | 2:3dabedbecf5e | 61 | // pinMode(blueLed, OUTPUT); |
reedas | 2:3dabedbecf5e | 62 | // dht.begin(); |
reedas | 2:3dabedbecf5e | 63 | // sensor_t sensor; |
reedas | 2:3dabedbecf5e | 64 | // dht.temperature().getSensor(&sensor); |
reedas | 2:3dabedbecf5e | 65 | // dht.humidity().getSensor(&sensor); |
reedas | 2:3dabedbecf5e | 66 | // delayMS = sensor.min_delay / 1000; |
reedas | 2:3dabedbecf5e | 67 | // Serial.begin(115200); //Begins Serial Communication at // 9600 baud rate |
reedas | 2:3dabedbecf5e | 68 | // Wire.begin(8); //Begins I2C communication with // // Slave Address as 8 at pin (A4,A5) |
reedas | 2:3dabedbecf5e | 69 | // Wire.onReceive(receiveEvent); //Function call when Slave receives // value from master |
reedas | 2:3dabedbecf5e | 70 | // Wire.onRequest(requestEvent); //Function call when Master request // value from Slave |
reedas | 2:3dabedbecf5e | 71 | // } |
reedas | 3:62825c5f3cd7 | 72 | // |
reedas | 2:3dabedbecf5e | 73 | // void loop(void) |
reedas | 2:3dabedbecf5e | 74 | // { |
reedas | 2:3dabedbecf5e | 75 | // unsigned char SW1Debounced; |
reedas | 2:3dabedbecf5e | 76 | // unsigned char SW2Debounced; |
reedas | 2:3dabedbecf5e | 77 | // int temperature = 20; |
reedas | 2:3dabedbecf5e | 78 | // while (1) { |
reedas | 2:3dabedbecf5e | 79 | // if (rxCommandNum || TESTING) { |
reedas | 3:62825c5f3cd7 | 80 | // |
reedas | 3:62825c5f3cd7 | 81 | // |
reedas | 2:3dabedbecf5e | 82 | // Serial.println("Slave Received Command From Master:"); //Prints in // // Serial Monitor |
reedas | 2:3dabedbecf5e | 83 | // Serial.print(rxCommand); |
reedas | 2:3dabedbecf5e | 84 | // Serial.print(" - "); |
reedas | 2:3dabedbecf5e | 85 | // Serial.println(rxCommandNum); |
reedas | 2:3dabedbecf5e | 86 | // for (int i = 0; i < 8; i++) { |
reedas | 2:3dabedbecf5e | 87 | // Serial.print( rxCommandPacket[i] ); |
reedas | 2:3dabedbecf5e | 88 | // Serial.print( " - " ); |
reedas | 2:3dabedbecf5e | 89 | // } |
reedas | 2:3dabedbecf5e | 90 | // Serial.println(" "); |
reedas | 2:3dabedbecf5e | 91 | // for (int i = 0; i < 10; i++) { |
reedas | 2:3dabedbecf5e | 92 | // Serial.print( txDataPacket[i] ); |
reedas | 2:3dabedbecf5e | 93 | // Serial.print( " - " ); |
reedas | 2:3dabedbecf5e | 94 | // } |
reedas | 2:3dabedbecf5e | 95 | // Serial.println(" "); |
reedas | 2:3dabedbecf5e | 96 | // rxCommandNum = 0; |
reedas | 2:3dabedbecf5e | 97 | // } |
reedas | 2:3dabedbecf5e | 98 | // sensors_event_t event; |
reedas | 2:3dabedbecf5e | 99 | // int potvalue = map( analogRead(A0), 0, 1023, 0, 100); // // Reads analog value from POT (0-5V) |
reedas | 2:3dabedbecf5e | 100 | // int lightlevel = map(analogRead(A1), 0, 1023, 0, 100); // // Ambient light level |
reedas | 2:3dabedbecf5e | 101 | // int humidityInt = 101; |
reedas | 2:3dabedbecf5e | 102 | // temperature = ((int)((lm35.readCelsius()) * 10)); // // // Ambient Temperature |
reedas | 2:3dabedbecf5e | 103 | // dht.humidity().getEvent(&event); |
reedas | 2:3dabedbecf5e | 104 | // if (isnan(event.relative_humidity)) { |
reedas | 2:3dabedbecf5e | 105 | // Serial.println(F("Error reading humidity!")); |
reedas | 2:3dabedbecf5e | 106 | // } |
reedas | 2:3dabedbecf5e | 107 | // else { |
reedas | 2:3dabedbecf5e | 108 | // humidityInt = (int)event.relative_humidity; |
reedas | 2:3dabedbecf5e | 109 | // Serial.print(F("Humidity: ")); |
reedas | 2:3dabedbecf5e | 110 | // Serial.print(humidityInt); |
reedas | 2:3dabedbecf5e | 111 | // Serial.println(F("%")); |
reedas | 2:3dabedbecf5e | 112 | // } |
reedas | 2:3dabedbecf5e | 113 | // txDataPacket[0] = potvalue; |
reedas | 2:3dabedbecf5e | 114 | // txDataPacket[1] = 0; // or potvalue >> 8; |
reedas | 2:3dabedbecf5e | 115 | // txDataPacket[2] = lightlevel; |
reedas | 2:3dabedbecf5e | 116 | // txDataPacket[3] = 0; // or lightlevel >> 8; |
reedas | 2:3dabedbecf5e | 117 | // txDataPacket[4] = temperature; |
reedas | 2:3dabedbecf5e | 118 | // txDataPacket[5] = temperature >> 8; |
reedas | 2:3dabedbecf5e | 119 | // SW1Debounced = (SW1Debounced << 1) | digitalRead(SW1Pin); |
reedas | 2:3dabedbecf5e | 120 | // if (SW1Debounced == 0) SW1Pressed = 1; |
reedas | 2:3dabedbecf5e | 121 | // SW2Debounced = (SW2Debounced << 1) | digitalRead(SW2Pin); |
reedas | 2:3dabedbecf5e | 122 | // if (SW2Debounced == 0) SW2Pressed = 1; |
reedas | 2:3dabedbecf5e | 123 | // txDataPacket[6] = SW1Pressed; |
reedas | 2:3dabedbecf5e | 124 | // txDataPacket[7] = SW2Pressed; |
reedas | 2:3dabedbecf5e | 125 | // txDataPacket[8] = humidityInt; |
reedas | 2:3dabedbecf5e | 126 | // txDataPacket[9] = 0; |
reedas | 2:3dabedbecf5e | 127 | // digitalWrite(blueLed, rxCommandPacket[1] & 1); |
reedas | 2:3dabedbecf5e | 128 | // delay(delayMS); |
reedas | 2:3dabedbecf5e | 129 | // if (TESTING) delay(2000); |
reedas | 2:3dabedbecf5e | 130 | // } |
reedas | 2:3dabedbecf5e | 131 | // } |
reedas | 3:62825c5f3cd7 | 132 | // |
reedas | 2:3dabedbecf5e | 133 | // void receiveEvent (int howMany) //This Function is called // when Slave receives value from master |
reedas | 2:3dabedbecf5e | 134 | // { for (int i = 0; i < howMany; i++) { |
reedas | 2:3dabedbecf5e | 135 | // rxCommandPacket[i] = Wire.read(); //Used to read value // received from master and store in variable SlaveReceived |
reedas | 2:3dabedbecf5e | 136 | // } |
reedas | 2:3dabedbecf5e | 137 | // rxCommandNum = howMany; |
reedas | 2:3dabedbecf5e | 138 | // rxCommand = rxCommandPacket[0]; |
reedas | 3:62825c5f3cd7 | 139 | // } |
reedas | 3:62825c5f3cd7 | 140 | // void requestEvent() //This Function is called when Master wants data from slave |
reedas | 3:62825c5f3cd7 | 141 | // { |
reedas | 3:62825c5f3cd7 | 142 | // Wire.write(txDataPacket, 10); // sends eight bytes of data to master |
reedas | 3:62825c5f3cd7 | 143 | // SW1Pressed = 0; // Clear key presses on send to master |
reedas | 3:62825c5f3cd7 | 144 | // SW2Pressed = 0; |
reedas | 3:62825c5f3cd7 | 145 | // } |
reedas | 0:e9613d017b5e | 146 | |
reedas | 0:e9613d017b5e | 147 | #include "mbed.h" |
reedas | 0:e9613d017b5e | 148 | #include "platform/mbed_thread.h" |
reedas | 0:e9613d017b5e | 149 | #include "GUI.h" |
reedas | 0:e9613d017b5e | 150 | #include "cy8ckit_028_tft.h" |
reedas | 0:e9613d017b5e | 151 | |
reedas | 0:e9613d017b5e | 152 | #define UNO_CMD (0x10) // Command byte to Uno |
reedas | 0:e9613d017b5e | 153 | #define UNO_CMD_CONF (0x01) // Configuration data |
reedas | 0:e9613d017b5e | 154 | #define UNO_ADDR (0x10) // LM75 address |
reedas | 0:e9613d017b5e | 155 | |
reedas | 0:e9613d017b5e | 156 | //I2C i2c(P8_1, P8_0); |
reedas | 0:e9613d017b5e | 157 | I2C i2c(I2C_SDA, I2C_SCL); |
reedas | 0:e9613d017b5e | 158 | DigitalOut myled(LED1); |
reedas | 3:62825c5f3cd7 | 159 | #include <MQTTClientMbedOs.h> |
reedas | 3:62825c5f3cd7 | 160 | |
reedas | 3:62825c5f3cd7 | 161 | //NetworkInterface* network; |
reedas | 0:e9613d017b5e | 162 | |
reedas | 0:e9613d017b5e | 163 | //Serial pc(SERIAL_TX, SERIAL_RX); |
reedas | 0:e9613d017b5e | 164 | Serial pc(USBTX, USBRX); |
reedas | 0:e9613d017b5e | 165 | |
reedas | 3:62825c5f3cd7 | 166 | #define APP_INFO( x ) pc.printf x |
reedas | 3:62825c5f3cd7 | 167 | |
reedas | 0:e9613d017b5e | 168 | volatile char TempCelsiusDisplay[] = "+abc.d C"; |
reedas | 3:62825c5f3cd7 | 169 | int lastLightDisplay = 101; |
reedas | 3:62825c5f3cd7 | 170 | int lthresh = 50; |
reedas | 0:e9613d017b5e | 171 | |
reedas | 3:62825c5f3cd7 | 172 | int arrivedcount = 0; |
reedas | 3:62825c5f3cd7 | 173 | |
reedas | 3:62825c5f3cd7 | 174 | void messageArrived(MQTT::MessageData& md) |
reedas | 3:62825c5f3cd7 | 175 | { |
reedas | 3:62825c5f3cd7 | 176 | // char buf[80]; |
reedas | 3:62825c5f3cd7 | 177 | MQTT::Message &message = md.message; |
reedas | 3:62825c5f3cd7 | 178 | APP_INFO(("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id)); |
reedas | 3:62825c5f3cd7 | 179 | APP_INFO(("Payload %.*s\r\n", message.payloadlen, (char*)message.payload)); |
reedas | 3:62825c5f3cd7 | 180 | // lthresh = stoi((string)message.payload); |
reedas | 3:62825c5f3cd7 | 181 | // } |
reedas | 3:62825c5f3cd7 | 182 | arrivedcount++; |
reedas | 3:62825c5f3cd7 | 183 | APP_INFO(("Arrived = %d\r\n",arrivedcount)); |
reedas | 3:62825c5f3cd7 | 184 | } |
reedas | 0:e9613d017b5e | 185 | int main() |
reedas | 0:e9613d017b5e | 186 | { |
reedas | 0:e9613d017b5e | 187 | |
reedas | 0:e9613d017b5e | 188 | char data_write[8]; |
reedas | 2:3dabedbecf5e | 189 | char data_read[10]; |
reedas | 0:e9613d017b5e | 190 | char buffer[120]; |
reedas | 3:62825c5f3cd7 | 191 | int rc; |
reedas | 0:e9613d017b5e | 192 | |
reedas | 0:e9613d017b5e | 193 | /* Initialise display */ |
reedas | 0:e9613d017b5e | 194 | GUI_Init(); |
reedas | 0:e9613d017b5e | 195 | GUI_Clear(); |
reedas | 0:e9613d017b5e | 196 | |
reedas | 3:62825c5f3cd7 | 197 | APP_INFO(("Connecting to the network using Wifi...\r\n")); |
reedas | 3:62825c5f3cd7 | 198 | // network = NetworkInterface::get_default_instance(); |
reedas | 3:62825c5f3cd7 | 199 | NetworkInterface *network = NetworkInterface::get_default_instance(); |
reedas | 3:62825c5f3cd7 | 200 | |
reedas | 3:62825c5f3cd7 | 201 | nsapi_error_t net_status = -1; |
reedas | 3:62825c5f3cd7 | 202 | for (int tries = 0; tries < 10; tries++) { |
reedas | 3:62825c5f3cd7 | 203 | net_status = network->connect(); |
reedas | 3:62825c5f3cd7 | 204 | if (net_status == NSAPI_ERROR_OK) { |
reedas | 3:62825c5f3cd7 | 205 | break; |
reedas | 3:62825c5f3cd7 | 206 | } else { |
reedas | 3:62825c5f3cd7 | 207 | APP_INFO(("Unable to connect to network. Retrying...\r\n")); |
reedas | 3:62825c5f3cd7 | 208 | } |
reedas | 3:62825c5f3cd7 | 209 | } |
reedas | 3:62825c5f3cd7 | 210 | |
reedas | 3:62825c5f3cd7 | 211 | if (net_status != NSAPI_ERROR_OK) { |
reedas | 3:62825c5f3cd7 | 212 | APP_INFO(("ERROR: Connecting to the network failed (%d)!\r\n", net_status)); |
reedas | 3:62825c5f3cd7 | 213 | // return -1; |
reedas | 3:62825c5f3cd7 | 214 | } |
reedas | 0:e9613d017b5e | 215 | |
reedas | 3:62825c5f3cd7 | 216 | APP_INFO(("Connected to the network successfully. IP address: %s\n", network->get_ip_address())); |
reedas | 3:62825c5f3cd7 | 217 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
reedas | 3:62825c5f3cd7 | 218 | data.clientID.cstring = (char *)"my_thing"; |
reedas | 3:62825c5f3cd7 | 219 | data.keepAliveInterval = 20; |
reedas | 3:62825c5f3cd7 | 220 | data.cleansession = 1; |
reedas | 3:62825c5f3cd7 | 221 | data.username.cstring = (char *)""; |
reedas | 3:62825c5f3cd7 | 222 | data.password.cstring = (char *)""; |
reedas | 3:62825c5f3cd7 | 223 | // char *host = "10.0.0.2"; |
reedas | 3:62825c5f3cd7 | 224 | char *host = (char *)"192.168.1.174"; |
reedas | 3:62825c5f3cd7 | 225 | int port = 1883; |
reedas | 3:62825c5f3cd7 | 226 | TCPSocket socket; |
reedas | 3:62825c5f3cd7 | 227 | MQTTClient client(&socket); |
reedas | 3:62825c5f3cd7 | 228 | socket.open(network); |
reedas | 3:62825c5f3cd7 | 229 | socket.connect(host, port); |
reedas | 3:62825c5f3cd7 | 230 | client.connect(data); |
reedas | 3:62825c5f3cd7 | 231 | MQTT::Message message; |
reedas | 3:62825c5f3cd7 | 232 | sprintf(buffer, "Hello World! from My Thang\r\n"); |
reedas | 3:62825c5f3cd7 | 233 | message.qos = MQTT::QOS0; |
reedas | 3:62825c5f3cd7 | 234 | message.retained = false; |
reedas | 3:62825c5f3cd7 | 235 | message.dup = false; |
reedas | 3:62825c5f3cd7 | 236 | message.payload = (void*)buffer; |
reedas | 3:62825c5f3cd7 | 237 | message.payloadlen = strlen(buffer)+1; |
reedas | 3:62825c5f3cd7 | 238 | |
reedas | 3:62825c5f3cd7 | 239 | client.publish( "mytopic/announce", message); |
reedas | 3:62825c5f3cd7 | 240 | rc = client.subscribe("mytopic/lthresh", MQTT::QOS0, messageArrived); |
reedas | 3:62825c5f3cd7 | 241 | if (rc) APP_INFO(("Subscription Error %d", rc)); |
reedas | 3:62825c5f3cd7 | 242 | else APP_INFO(("Subscribed to mytopic/lthresh")); |
reedas | 3:62825c5f3cd7 | 243 | |
reedas | 3:62825c5f3cd7 | 244 | sprintf(buffer, "%d",lthresh); |
reedas | 3:62825c5f3cd7 | 245 | message.payload = (void*)buffer; |
reedas | 3:62825c5f3cd7 | 246 | message.payloadlen = strlen(buffer)+1; |
reedas | 3:62825c5f3cd7 | 247 | client.publish("mytopic/lthresh", message); |
reedas | 0:e9613d017b5e | 248 | data_write[0] = UNO_CMD; |
reedas | 0:e9613d017b5e | 249 | data_write[1] = 0x08; |
reedas | 0:e9613d017b5e | 250 | |
reedas | 0:e9613d017b5e | 251 | GUI_SetFont(GUI_FONT_10_1); |
reedas | 0:e9613d017b5e | 252 | GUI_SetTextAlign(GUI_TA_LEFT); |
reedas | 0:e9613d017b5e | 253 | int status = i2c.write(UNO_ADDR, data_write, 2, 0); |
reedas | 3:62825c5f3cd7 | 254 | // if (status != 0) { // Error |
reedas | 3:62825c5f3cd7 | 255 | // GUI_DispStringAt("I2C Error", 0, 220); |
reedas | 3:62825c5f3cd7 | 256 | // pc.printf("I2C connect error\n"); |
reedas | 3:62825c5f3cd7 | 257 | // while (1) { |
reedas | 3:62825c5f3cd7 | 258 | // myled = !myled; |
reedas | 3:62825c5f3cd7 | 259 | // ThisThread::sleep_for(200); |
reedas | 3:62825c5f3cd7 | 260 | // } |
reedas | 3:62825c5f3cd7 | 261 | // } |
reedas | 3:62825c5f3cd7 | 262 | pc.printf("I2C connected"); |
reedas | 0:e9613d017b5e | 263 | GUI_SetFont(GUI_FONT_20B_1); |
reedas | 0:e9613d017b5e | 264 | GUI_DispStringAt("Data from Arduino", 0, 0); |
reedas | 3:62825c5f3cd7 | 265 | int lightDisplay; |
reedas | 3:62825c5f3cd7 | 266 | int potValue; |
reedas | 3:62825c5f3cd7 | 267 | int humidity; |
reedas | 0:e9613d017b5e | 268 | |
reedas | 0:e9613d017b5e | 269 | while (1) { |
reedas | 3:62825c5f3cd7 | 270 | |
reedas | 0:e9613d017b5e | 271 | // Read Arduino data |
reedas | 0:e9613d017b5e | 272 | data_write[0] = UNO_CMD; |
reedas | 0:e9613d017b5e | 273 | i2c.write(UNO_ADDR, data_write, 2, 1); // no stop |
reedas | 3:62825c5f3cd7 | 274 | // if (i2c.read(UNO_ADDR, data_read, 10, 0)) { |
reedas | 3:62825c5f3cd7 | 275 | // GUI_SetFont(GUI_FONT_10_1); |
reedas | 3:62825c5f3cd7 | 276 | // GUI_DispStringAt("I2C receive error ", 0, 220); |
reedas | 3:62825c5f3cd7 | 277 | // pc.printf("I2C Rx Error\n"); |
reedas | 3:62825c5f3cd7 | 278 | // } else |
reedas | 3:62825c5f3cd7 | 279 | { |
reedas | 3:62825c5f3cd7 | 280 | i2c.read(UNO_ADDR, data_read, 10, 0); |
reedas | 3:62825c5f3cd7 | 281 | for (int i; i < 10; i++) pc.printf("%2x - ", data_read[i]); |
reedas | 3:62825c5f3cd7 | 282 | pc.printf("\n"); |
reedas | 0:e9613d017b5e | 283 | GUI_SetFont(GUI_FONT_10_1); |
reedas | 3:62825c5f3cd7 | 284 | sprintf(buffer, "I2c Data Received, IP address is: %s arrived %d", network->get_ip_address(), arrivedcount); |
reedas | 3:62825c5f3cd7 | 285 | GUI_DispStringAt(buffer, 0, 220); |
reedas | 3:62825c5f3cd7 | 286 | pc.printf("I2C Rx data recevied\n"); |
reedas | 0:e9613d017b5e | 287 | |
reedas | 0:e9613d017b5e | 288 | // read eight bytes |
reedas | 0:e9613d017b5e | 289 | // pot value - msb-0, lsb-1 |
reedas | 0:e9613d017b5e | 290 | // light level - msb-2, lsb-3 |
reedas | 0:e9613d017b5e | 291 | // temperature - msb-4, lsb-5 |
reedas | 0:e9613d017b5e | 292 | // sw1 state - 6 - 0-255 based on how long pressed |
reedas | 0:e9613d017b5e | 293 | // sw2 state - 7 - 0-255 based on how long pressed |
reedas | 2:3dabedbecf5e | 294 | // Humidity - msb-9, lsb-8 |
reedas | 0:e9613d017b5e | 295 | |
reedas | 0:e9613d017b5e | 296 | // Calculate temperature value in Celcius |
reedas | 0:e9613d017b5e | 297 | int tempval = (int)((int)data_read[5] << 8) | data_read[4]; |
reedas | 0:e9613d017b5e | 298 | if (tempval < 0) { |
reedas | 0:e9613d017b5e | 299 | TempCelsiusDisplay[0] = '-'; |
reedas | 0:e9613d017b5e | 300 | } else { |
reedas | 0:e9613d017b5e | 301 | TempCelsiusDisplay[0] = '+'; |
reedas | 0:e9613d017b5e | 302 | } |
reedas | 0:e9613d017b5e | 303 | |
reedas | 0:e9613d017b5e | 304 | // Integer part |
reedas | 0:e9613d017b5e | 305 | TempCelsiusDisplay[1] = (tempval / 1000) + 0x30; |
reedas | 0:e9613d017b5e | 306 | TempCelsiusDisplay[2] = ((tempval % 1000) / 100) + 0x30; |
reedas | 0:e9613d017b5e | 307 | TempCelsiusDisplay[3] = ((tempval % 1000) % 100 / 10) + 0x30; |
reedas | 0:e9613d017b5e | 308 | TempCelsiusDisplay[5] = ((tempval % 1000) % 100 % 10) + 0x30; |
reedas | 0:e9613d017b5e | 309 | |
reedas | 0:e9613d017b5e | 310 | //Switches |
reedas | 0:e9613d017b5e | 311 | |
reedas | 0:e9613d017b5e | 312 | unsigned char SW1State = data_read[6]; |
reedas | 0:e9613d017b5e | 313 | unsigned char SW2State = data_read[7]; |
reedas | 0:e9613d017b5e | 314 | |
reedas | 0:e9613d017b5e | 315 | //light level |
reedas | 3:62825c5f3cd7 | 316 | lightDisplay = (int)((int)data_read[3] << 8) | data_read[2]; |
reedas | 0:e9613d017b5e | 317 | |
reedas | 0:e9613d017b5e | 318 | //potentiometer value |
reedas | 3:62825c5f3cd7 | 319 | potValue = (int)((int)data_read[1] << 8) | data_read[0]; |
reedas | 3:62825c5f3cd7 | 320 | |
reedas | 3:62825c5f3cd7 | 321 | // humidity value |
reedas | 3:62825c5f3cd7 | 322 | humidity = (int)((int)data_read[9] << 8) | data_read[8]; |
reedas | 0:e9613d017b5e | 323 | |
reedas | 0:e9613d017b5e | 324 | // Display result |
reedas | 2:3dabedbecf5e | 325 | pc.printf("temp = %s, Light is %3d%%, Hum is %3d%%%s%s\n", TempCelsiusDisplay, lightDisplay, humidity, SW1State?", SW1 pressed":"", SW2State?", SW2 pressed":""); |
reedas | 0:e9613d017b5e | 326 | |
reedas | 2:3dabedbecf5e | 327 | 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"); |
reedas | 0:e9613d017b5e | 328 | GUI_SetFont(GUI_FONT_20_1); |
reedas | 0:e9613d017b5e | 329 | GUI_DispStringAt(buffer, 0, 40); |
reedas | 0:e9613d017b5e | 330 | } |
reedas | 3:62825c5f3cd7 | 331 | sprintf(buffer, "Light Level is %d\r\n", lightDisplay); |
reedas | 3:62825c5f3cd7 | 332 | message.payload = (void*)buffer; |
reedas | 3:62825c5f3cd7 | 333 | message.payloadlen = strlen(buffer)+1; |
reedas | 3:62825c5f3cd7 | 334 | |
reedas | 3:62825c5f3cd7 | 335 | // if (lightDisplay != lastLightDisplay) { |
reedas | 3:62825c5f3cd7 | 336 | client.publish( "mytopic/light", message); |
reedas | 3:62825c5f3cd7 | 337 | lastLightDisplay = lightDisplay; |
reedas | 3:62825c5f3cd7 | 338 | // } |
reedas | 3:62825c5f3cd7 | 339 | |
reedas | 0:e9613d017b5e | 340 | myled = !myled; |
reedas | 2:3dabedbecf5e | 341 | data_write[1] = data_write[1] ^ 0x01; |
reedas | 3:62825c5f3cd7 | 342 | thread_sleep_for(1000); |
reedas | 0:e9613d017b5e | 343 | } |
reedas | 0:e9613d017b5e | 344 | |
reedas | 0:e9613d017b5e | 345 | } |
reedas | 0:e9613d017b5e | 346 |