Initial

Dependencies:   TextLCD2

Committer:
reedas
Date:
Tue Jan 14 11:30:06 2020 +0000
Revision:
1:f9ef03b6aab8
Parent:
0:e9613d017b5e
Child:
2:3dabedbecf5e
Initial Commit;

Who changed what in which revision?

UserRevisionLine numberNew 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 0:e9613d017b5e 11 *
reedas 0:e9613d017b5e 12 * //I2C SLAVE CODE
reedas 0:e9613d017b5e 13 * //I2C Communication between Two Arduino
reedas 0:e9613d017b5e 14 * //CircuitDigest
reedas 0:e9613d017b5e 15 * //Pramoth.T
reedas 0:e9613d017b5e 16 *
reedas 0:e9613d017b5e 17 * #include<Wire.h> //Library for I2C Communication functions
reedas 0:e9613d017b5e 18 *
reedas 0:e9613d017b5e 19 * #include <PreciseLM35.h>
reedas 0:e9613d017b5e 20 *
reedas 0:e9613d017b5e 21 * const int pinLM35 = A2;
reedas 0:e9613d017b5e 22 * PreciseLM35 lm35(pinLM35, DEFAULT);
reedas 0:e9613d017b5e 23 *
reedas 0:e9613d017b5e 24 *
reedas 0:e9613d017b5e 25 * unsigned char txDataPacket[8];
reedas 0:e9613d017b5e 26 * unsigned char rxCommandPacket[8];
reedas 0:e9613d017b5e 27 * unsigned char rxCommandNum;
reedas 0:e9613d017b5e 28 * unsigned char rxCommand = 0;
reedas 0:e9613d017b5e 29 * bool SW1Pressed = 0;
reedas 0:e9613d017b5e 30 * bool SW2Pressed = 0;
reedas 0:e9613d017b5e 31 *
reedas 0:e9613d017b5e 32 *
reedas 0:e9613d017b5e 33 * int SW1Pin = 2;
reedas 0:e9613d017b5e 34 * int SW2Pin = 3;
reedas 0:e9613d017b5e 35 *
reedas 0:e9613d017b5e 36 * void setup()
reedas 0:e9613d017b5e 37 *
reedas 0:e9613d017b5e 38 * {
reedas 0:e9613d017b5e 39 * pinMode(SW1Pin, INPUT);
reedas 0:e9613d017b5e 40 * pinMode(SW2Pin, INPUT);
reedas 0:e9613d017b5e 41 * Serial.begin(9600); //Begins Serial Communication at 9600 baud rate
reedas 0:e9613d017b5e 42 * Wire.begin(8); //Begins I2C communication with Slave Address as 8 at pin (A4,A5)
reedas 0:e9613d017b5e 43 * Wire.onReceive(receiveEvent); //Function call when Slave receives value from master
reedas 0:e9613d017b5e 44 * Wire.onRequest(requestEvent); //Function call when Master request value from Slave
reedas 0:e9613d017b5e 45 * }
reedas 0:e9613d017b5e 46 *
reedas 0:e9613d017b5e 47 * void loop(void)
reedas 0:e9613d017b5e 48 * {
reedas 0:e9613d017b5e 49 * unsigned char SW1Debounced;
reedas 0:e9613d017b5e 50 * unsigned char SW2Debounced;
reedas 0:e9613d017b5e 51 *
reedas 0:e9613d017b5e 52 * if (rxCommandNum) {
reedas 0:e9613d017b5e 53 *
reedas 0:e9613d017b5e 54 *
reedas 0:e9613d017b5e 55 * Serial.println("Slave Received Command From Master:"); //Prints in Serial Monitor
reedas 0:e9613d017b5e 56 * Serial.print(rxCommand);
reedas 0:e9613d017b5e 57 * Serial.print(" - ");
reedas 0:e9613d017b5e 58 * Serial.println(rxCommandNum);
reedas 0:e9613d017b5e 59 * for (int i = 0; i < 8; i++) {
reedas 0:e9613d017b5e 60 * Serial.print( rxCommandPacket[i] );
reedas 0:e9613d017b5e 61 * Serial.print( " - " );
reedas 0:e9613d017b5e 62 * }
reedas 0:e9613d017b5e 63 * Serial.println(" ");
reedas 0:e9613d017b5e 64 * for (int i = 0; i < 8; i++) {
reedas 0:e9613d017b5e 65 * Serial.print( txDataPacket[i] );
reedas 0:e9613d017b5e 66 * Serial.print( " - " );
reedas 0:e9613d017b5e 67 * }
reedas 0:e9613d017b5e 68 * Serial.println(" ");
reedas 0:e9613d017b5e 69 * rxCommandNum = 0;
reedas 0:e9613d017b5e 70 * }
reedas 0:e9613d017b5e 71 * int potvalue = map( analogRead(A0), 0, 1023, 0, 100); // Reads analog value from POT (0-5V)
reedas 0:e9613d017b5e 72 * int lightlevel = map(analogRead(A1), 0, 1023, 0, 100); // Ambient light level
reedas 0:e9613d017b5e 73 * int temperature = (int)((lm35.readCelsius()) * 10); // Ambient Temperature
reedas 0:e9613d017b5e 74 * txDataPacket[0] = potvalue;
reedas 0:e9613d017b5e 75 * txDataPacket[1] = 0; // or potvalue >> 8;
reedas 0:e9613d017b5e 76 * txDataPacket[2] = lightlevel;
reedas 0:e9613d017b5e 77 * txDataPacket[3] = 0; // or lightlevel >> 8;
reedas 0:e9613d017b5e 78 * txDataPacket[4] = temperature;
reedas 0:e9613d017b5e 79 * txDataPacket[5] = temperature >> 8;
reedas 0:e9613d017b5e 80 * SW1Debounced = (SW1Debounced << 1) | digitalRead(SW1Pin);
reedas 0:e9613d017b5e 81 * if (SW1Debounced == 0) SW1Pressed = 1;
reedas 0:e9613d017b5e 82 * SW2Debounced = (SW2Debounced << 1) | digitalRead(SW2Pin);
reedas 0:e9613d017b5e 83 * if (SW2Debounced == 0) SW2Pressed = 1;
reedas 0:e9613d017b5e 84 * txDataPacket[6] = SW1Pressed;
reedas 0:e9613d017b5e 85 * txDataPacket[7] = SW2Pressed;
reedas 0:e9613d017b5e 86 *
reedas 0:e9613d017b5e 87 * // delay(500);
reedas 0:e9613d017b5e 88 * }
reedas 0:e9613d017b5e 89 *
reedas 0:e9613d017b5e 90 * void receiveEvent (int howMany) //This Function is called when Slave receives value from master
reedas 0:e9613d017b5e 91 * { for (int i = 0; i < howMany; i++) {
reedas 0:e9613d017b5e 92 * rxCommandPacket[i] = Wire.read(); //Used to read value received from master and store in variable SlaveReceived
reedas 0:e9613d017b5e 93 * }
reedas 0:e9613d017b5e 94 * rxCommandNum = howMany;
reedas 0:e9613d017b5e 95 * rxCommand = rxCommandPacket[0];
reedas 0:e9613d017b5e 96 * }
reedas 0:e9613d017b5e 97 *
reedas 0:e9613d017b5e 98 * void requestEvent() //This Function is called when Master wants data from slave
reedas 0:e9613d017b5e 99 * {
reedas 0:e9613d017b5e 100 * Wire.write(txDataPacket, 8); // sends eight bytes of data to master
reedas 0:e9613d017b5e 101 * SW1Pressed = 0; // Clear key presses on send to master
reedas 0:e9613d017b5e 102 * SW2Pressed = 0;
reedas 0:e9613d017b5e 103 * }
reedas 0:e9613d017b5e 104 *
reedas 0:e9613d017b5e 105 */
reedas 0:e9613d017b5e 106
reedas 0:e9613d017b5e 107 #include "mbed.h"
reedas 0:e9613d017b5e 108 #include "platform/mbed_thread.h"
reedas 0:e9613d017b5e 109 #include "TextLCD.h"
reedas 0:e9613d017b5e 110 #include "GUI.h"
reedas 0:e9613d017b5e 111 #include "cy8ckit_028_tft.h"
reedas 0:e9613d017b5e 112
reedas 0:e9613d017b5e 113
reedas 0:e9613d017b5e 114 #define UNO_CMD (0x10) // Command byte to Uno
reedas 0:e9613d017b5e 115 #define UNO_CMD_CONF (0x01) // Configuration data
reedas 0:e9613d017b5e 116 #define UNO_ADDR (0x10) // LM75 address
reedas 0:e9613d017b5e 117
reedas 0:e9613d017b5e 118 //I2C i2c(P8_1, P8_0);
reedas 0:e9613d017b5e 119 I2C i2c(I2C_SDA, I2C_SCL);
reedas 0:e9613d017b5e 120 TextLCD_I2C lcd(&i2c, 0x7e, TextLCD::LCD16x2 /*, TextLCD::WS0010*/); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type
reedas 0:e9613d017b5e 121 //TextLCD_I2C lcd(&i2c, 0x4e, TextLCD::LCD16x2 /*, TextLCD::WS0010*/); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type
reedas 0:e9613d017b5e 122 DigitalOut myled(LED1);
reedas 0:e9613d017b5e 123
reedas 0:e9613d017b5e 124 //Serial pc(SERIAL_TX, SERIAL_RX);
reedas 0:e9613d017b5e 125 Serial pc(USBTX, USBRX);
reedas 0:e9613d017b5e 126
reedas 0:e9613d017b5e 127 volatile char TempCelsiusDisplay[] = "+abc.d C";
reedas 0:e9613d017b5e 128
reedas 0:e9613d017b5e 129 int main()
reedas 0:e9613d017b5e 130 {
reedas 0:e9613d017b5e 131
reedas 0:e9613d017b5e 132 char data_write[8];
reedas 0:e9613d017b5e 133 char data_read[8];
reedas 0:e9613d017b5e 134 char buffer[120];
reedas 0:e9613d017b5e 135
reedas 0:e9613d017b5e 136 /* Initialise display */
reedas 0:e9613d017b5e 137 GUI_Init();
reedas 0:e9613d017b5e 138 GUI_Clear();
reedas 0:e9613d017b5e 139
reedas 0:e9613d017b5e 140 lcd.cls();
reedas 0:e9613d017b5e 141 lcd.setBacklight(TextLCD::LightOn);
reedas 0:e9613d017b5e 142 lcd.setCursor(TextLCD::CurOff_BlkOff);
reedas 0:e9613d017b5e 143
reedas 0:e9613d017b5e 144 /* Configure the Temperature sensor device STLM75:
reedas 0:e9613d017b5e 145 - Thermostat mode Interrupt
reedas 0:e9613d017b5e 146 - Fault tolerance: 0
reedas 0:e9613d017b5e 147 */
reedas 0:e9613d017b5e 148 data_write[0] = UNO_CMD;
reedas 0:e9613d017b5e 149 data_write[1] = 0x08;
reedas 0:e9613d017b5e 150
reedas 0:e9613d017b5e 151 GUI_SetFont(GUI_FONT_10_1);
reedas 0:e9613d017b5e 152 GUI_SetTextAlign(GUI_TA_LEFT);
reedas 0:e9613d017b5e 153 int status = i2c.write(UNO_ADDR, data_write, 2, 0);
reedas 0:e9613d017b5e 154 if (status != 0) { // Error
reedas 0:e9613d017b5e 155 GUI_DispStringAt("I2C Error", 0, 220);
reedas 0:e9613d017b5e 156 while (1) {
reedas 0:e9613d017b5e 157 myled = !myled;
reedas 0:e9613d017b5e 158 ThisThread::sleep_for(200);
reedas 0:e9613d017b5e 159 }
reedas 0:e9613d017b5e 160 }
reedas 0:e9613d017b5e 161 GUI_DispStringAt("I2C Connected", 0, 220);
reedas 0:e9613d017b5e 162 GUI_SetFont(GUI_FONT_20B_1);
reedas 0:e9613d017b5e 163 GUI_DispStringAt("Data from Arduino", 0, 0);
reedas 0:e9613d017b5e 164
reedas 0:e9613d017b5e 165 while (1) {
reedas 0:e9613d017b5e 166 // Read Arduino data
reedas 0:e9613d017b5e 167 data_write[0] = UNO_CMD;
reedas 0:e9613d017b5e 168 i2c.write(UNO_ADDR, data_write, 2, 1); // no stop
reedas 0:e9613d017b5e 169 if (i2c.read(UNO_ADDR, data_read, 8, 0)) {
reedas 0:e9613d017b5e 170 GUI_SetFont(GUI_FONT_10_1);
reedas 0:e9613d017b5e 171 GUI_DispStringAt("I2C receive error ", 0, 220);
reedas 0:e9613d017b5e 172 } else {
reedas 0:e9613d017b5e 173 GUI_SetFont(GUI_FONT_10_1);
reedas 0:e9613d017b5e 174 GUI_DispStringAt("I2C Data Received ", 0, 220);
reedas 0:e9613d017b5e 175
reedas 0:e9613d017b5e 176 // read eight bytes
reedas 0:e9613d017b5e 177 // pot value - msb-0, lsb-1
reedas 0:e9613d017b5e 178 // light level - msb-2, lsb-3
reedas 0:e9613d017b5e 179 // temperature - msb-4, lsb-5
reedas 0:e9613d017b5e 180 // sw1 state - 6 - 0-255 based on how long pressed
reedas 0:e9613d017b5e 181 // sw2 state - 7 - 0-255 based on how long pressed
reedas 0:e9613d017b5e 182
reedas 0:e9613d017b5e 183 // Calculate temperature value in Celcius
reedas 0:e9613d017b5e 184 int tempval = (int)((int)data_read[5] << 8) | data_read[4];
reedas 0:e9613d017b5e 185 if (tempval < 0) {
reedas 0:e9613d017b5e 186 TempCelsiusDisplay[0] = '-';
reedas 0:e9613d017b5e 187 } else {
reedas 0:e9613d017b5e 188 TempCelsiusDisplay[0] = '+';
reedas 0:e9613d017b5e 189 }
reedas 0:e9613d017b5e 190
reedas 0:e9613d017b5e 191 // Integer part
reedas 0:e9613d017b5e 192 TempCelsiusDisplay[1] = (tempval / 1000) + 0x30;
reedas 0:e9613d017b5e 193 TempCelsiusDisplay[2] = ((tempval % 1000) / 100) + 0x30;
reedas 0:e9613d017b5e 194 TempCelsiusDisplay[3] = ((tempval % 1000) % 100 / 10) + 0x30;
reedas 0:e9613d017b5e 195 TempCelsiusDisplay[5] = ((tempval % 1000) % 100 % 10) + 0x30;
reedas 0:e9613d017b5e 196
reedas 0:e9613d017b5e 197 //Switches
reedas 0:e9613d017b5e 198
reedas 0:e9613d017b5e 199 unsigned char SW1State = data_read[6];
reedas 0:e9613d017b5e 200 unsigned char SW2State = data_read[7];
reedas 0:e9613d017b5e 201
reedas 0:e9613d017b5e 202 //light level
reedas 0:e9613d017b5e 203 int lightDisplay = (int)((int)data_read[3] << 8) | data_read[2];
reedas 0:e9613d017b5e 204
reedas 0:e9613d017b5e 205 //potentiometer value
reedas 0:e9613d017b5e 206 int potValue = (int)((int)data_read[1] << 8) | data_read[0];
reedas 0:e9613d017b5e 207
reedas 0:e9613d017b5e 208 // Display result
reedas 0:e9613d017b5e 209 pc.printf("temp = %s, Light is %3d%%, Pot is %3d%%%s%s\n", TempCelsiusDisplay, lightDisplay, potValue, SW1State?", SW1 pressed":"", SW2State?", SW2 pressed":"");
reedas 0:e9613d017b5e 210
reedas 0:e9613d017b5e 211 lcd.locate(0,0);
reedas 0:e9613d017b5e 212 lcd.printf("Temp Lght Pot 12");
reedas 0:e9613d017b5e 213 lcd.locate(0,1);
reedas 0:e9613d017b5e 214 lcd.printf(" %2dC %2d%c %2d%c %s%s", tempval/10, lightDisplay, 0x25, potValue, 0x25, SW1State?"1":"_", SW2State?"2":"_");
reedas 0:e9613d017b5e 215
reedas 0:e9613d017b5e 216 sprintf(buffer,"Temp is %2dC \nLight Level is %2d%c \nPot Value is %2d%c \n%s \n%s ", tempval/10, lightDisplay, 0x25, potValue, 0x25, SW1State?"SW1 Pressed ":"SW1 Released", SW2State?"SW2 Pressed ":"SW2 Released");
reedas 0:e9613d017b5e 217 GUI_SetFont(GUI_FONT_20_1);
reedas 0:e9613d017b5e 218 GUI_DispStringAt(buffer, 0, 40);
reedas 0:e9613d017b5e 219 }
reedas 0:e9613d017b5e 220 myled = !myled;
reedas 0:e9613d017b5e 221 thread_sleep_for(100);
reedas 0:e9613d017b5e 222 }
reedas 0:e9613d017b5e 223
reedas 0:e9613d017b5e 224 }
reedas 0:e9613d017b5e 225