JDI_MIP on ThunderBoardSense2(Silicon-Labs)

JDI_MIP (LPM013M126A) Sample on ThunderBoard2(Silicon-Labs)

/media/uploads/STakayama/mip8_tb2_sample0_.jpg LPM013M126A /media/uploads/STakayama/mip8_tb2_sample1.jpg

Links

https://os.mbed.com/teams/JapanDisplayInc/

https://os.mbed.com/teams/JapanDisplayInc/wiki/MIP-reflective-color-display

Committer:
STakayama
Date:
Tue Jan 22 10:23:39 2019 +0000
Revision:
13:9fb661dd4b2a
Parent:
12:39e048e73819
BackColor = Cyan

Who changed what in which revision?

UserRevisionLine numberNew contents of line
STakayama 10:525bcf8907fc 1 /***************************************************************************//**
STakayama 10:525bcf8907fc 2 * @file main.cpp
STakayama 10:525bcf8907fc 3 *******************************************************************************
STakayama 10:525bcf8907fc 4 * @section License
STakayama 10:525bcf8907fc 5 * <b>(C) Copyright 2017 Silicon Labs, http://www.silabs.com</b>
STakayama 10:525bcf8907fc 6 *******************************************************************************
STakayama 10:525bcf8907fc 7 *
STakayama 10:525bcf8907fc 8 * SPDX-License-Identifier: Apache-2.0
STakayama 10:525bcf8907fc 9 *
STakayama 10:525bcf8907fc 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
STakayama 10:525bcf8907fc 11 * not use this file except in compliance with the License.
STakayama 10:525bcf8907fc 12 * You may obtain a copy of the License at
STakayama 10:525bcf8907fc 13 *
STakayama 10:525bcf8907fc 14 * http://www.apache.org/licenses/LICENSE-2.0
STakayama 10:525bcf8907fc 15 *
STakayama 10:525bcf8907fc 16 * Unless required by applicable law or agreed to in writing, software
STakayama 10:525bcf8907fc 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
STakayama 10:525bcf8907fc 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
STakayama 10:525bcf8907fc 19 * See the License for the specific language governing permissions and
STakayama 10:525bcf8907fc 20 * limitations under the License.
STakayama 10:525bcf8907fc 21 *
STakayama 10:525bcf8907fc 22 ******************************************************************************/
STakayama 0:dbc295c4383e 23
STakayama 10:525bcf8907fc 24 #include <string>
STakayama 0:dbc295c4383e 25 #include "mbed.h"
STakayama 10:525bcf8907fc 26 #include "BMP280/BMP280.h"
STakayama 10:525bcf8907fc 27 #include "AMS_CCS811.h"
STakayama 10:525bcf8907fc 28 #include "Si7021.h"
STakayama 10:525bcf8907fc 29 #include "Si7210.h"
STakayama 4:588bc9618fff 30 #include "Si1133.h"
STakayama 10:525bcf8907fc 31 #include "ICM20648.h"
STakayama 10:525bcf8907fc 32
STakayama 3:79758cbd4a92 33 #include "SPI_MIP16.h"
STakayama 2:0585ae14d9a9 34 #include "data.h"
STakayama 5:79dc134e6033 35 #include "HGP23x29.h"
STakayama 5:79dc134e6033 36 #include "HGP15x19.h"
STakayama 10:525bcf8907fc 37
STakayama 0:dbc295c4383e 38
STakayama 10:525bcf8907fc 39 /* Turn on power supply to ENV sensor suite */
STakayama 10:525bcf8907fc 40 DigitalOut env_en(PF9, 1);
STakayama 10:525bcf8907fc 41 /* Turn on power to CCS811 sensor */
STakayama 10:525bcf8907fc 42 DigitalOut ccs_en(PF14, 1);
STakayama 10:525bcf8907fc 43 /* Set CCS_WAKE pin to output */
STakayama 10:525bcf8907fc 44 DigitalOut ccs_wake(PF15, 1);
STakayama 10:525bcf8907fc 45 /* Turn on power to hall effect sensor */
STakayama 10:525bcf8907fc 46 DigitalOut hall_en(PB10, 1);
STakayama 10:525bcf8907fc 47 /* Turn on power to IMU */
STakayama 10:525bcf8907fc 48 DigitalOut imu_en(PF8, 1);
STakayama 10:525bcf8907fc 49
STakayama 10:525bcf8907fc 50 I2C ccs_i2c(PB6, PB7);
STakayama 10:525bcf8907fc 51 I2C hall_i2c(PB8, PB9);
STakayama 10:525bcf8907fc 52 I2C env_i2c(PC4, PC5);
STakayama 10:525bcf8907fc 53
STakayama 10:525bcf8907fc 54 // MIP
STakayama 3:79758cbd4a92 55 WatchDisp WD(PK0,PK2,PF7,PA5); //PTC12); // mosi,miso,clk,cs,disp,power(EXTMODE)
STakayama 6:aaba08f73be5 56 DigitalOut _lcd_disp(PA8); // DISP
STakayama 6:aaba08f73be5 57 DigitalOut _lcd_extmod(PF6); // EXTMODE L=SERIAL, H=EXTCOMIN Signal
STakayama 6:aaba08f73be5 58 DigitalOut _lcd_extcom(PA9); // Togle
STakayama 0:dbc295c4383e 59
STakayama 3:79758cbd4a92 60 uint8_t ccolor_table[] = {Black,Gray,Blue ,LightBlue ,Green ,LightGreen ,Cyan ,LightCyan,
STakayama 3:79758cbd4a92 61 Red ,pink,Magenta,LightMagenta,Yellow,LightYellow,LightGray,White};
STakayama 10:525bcf8907fc 62 DigitalOut _pk1(PK1,1); // QSPI Flash CS Disable
STakayama 10:525bcf8907fc 63
STakayama 0:dbc295c4383e 64 bool if16 = 0;
STakayama 0:dbc295c4383e 65 bool ifMargeTXT = 0;
STakayama 3:79758cbd4a92 66 int width =176;
STakayama 3:79758cbd4a92 67 int height=176;
STakayama 10:525bcf8907fc 68 ///////////////////////////////////////
STakayama 12:39e048e73819 69 int disp_logo(void)
STakayama 12:39e048e73819 70 {
STakayama 12:39e048e73819 71 int RGB;
STakayama 12:39e048e73819 72 uint8_t R8,G8,B8;
STakayama 12:39e048e73819 73 uint8_t *cptr;
STakayama 12:39e048e73819 74 //for(int i=0; i< 54 ; i++) fscanf(fp,"%c",DUMMY); // Discard Header 54bytes
STakayama 12:39e048e73819 75 cptr = (uint8_t *)&Title_bmp[54];
STakayama 12:39e048e73819 76 for(int y=height-1; y>=0; y--) {
STakayama 12:39e048e73819 77 for(int x=0; x< width; x++) { //24bit color B 8bit -> G 8bit -> R 8bit
STakayama 12:39e048e73819 78 B8 = *cptr++;
STakayama 12:39e048e73819 79 G8 = *cptr++;
STakayama 12:39e048e73819 80 R8 = *cptr++;
STakayama 12:39e048e73819 81 RGB = RGB8(R8,G8,B8); //6bit(8bit) MIP MASK 0000 1110
STakayama 12:39e048e73819 82 WD.pixel(x,y,RGB);
STakayama 12:39e048e73819 83 }
STakayama 12:39e048e73819 84 //if( y!=0) // The last data column doesn't need padding
STakayama 12:39e048e73819 85 //for(int x=(width*3)%4; (x%4 !=0); x++) fscanf(fp, "%c",DUMMY); // 4byte boundery for every column
STakayama 12:39e048e73819 86 }
STakayama 12:39e048e73819 87 }
STakayama 12:39e048e73819 88
STakayama 12:39e048e73819 89 int lcd_init(void)
STakayama 3:79758cbd4a92 90 {
STakayama 3:79758cbd4a92 91 int i;
STakayama 3:79758cbd4a92 92 // Power On Sequece
STakayama 12:39e048e73819 93 // _lcd_reset = 0;
STakayama 12:39e048e73819 94 // _lcd_reset = 1;
STakayama 3:79758cbd4a92 95 _lcd_extmod = 0;
STakayama 5:79dc134e6033 96
STakayama 6:aaba08f73be5 97 WD.setWH(width,height); // Default X/Y-00
STakayama 3:79758cbd4a92 98 bool if16 = 1;
STakayama 12:39e048e73819 99 WD.set16col(if16); // 0= RGB, 1=RGBW
STakayama 3:79758cbd4a92 100 WD.setmarge(1);
STakayama 10:525bcf8907fc 101 WD.background(Cyan);
STakayama 3:79758cbd4a92 102 WD.clsBUF();
STakayama 12:39e048e73819 103 _lcd_disp = 1; //
STakayama 6:aaba08f73be5 104 //WD.fillrect(i*(width/16), height/2+1, (i+1)*(width/16)-1, height , ccolor_table[15-i]);
STakayama 10:525bcf8907fc 105 //WD.writeDISP();
STakayama 10:525bcf8907fc 106
STakayama 12:39e048e73819 107 //WD.set_font((unsigned char*) HGP23x29);
STakayama 12:39e048e73819 108 //WD.locate( 0, 43);WD.foreground(Blue); WD.printf("Environmental");
STakayama 12:39e048e73819 109 //WD.locate( 0, 83);WD.foreground(Blue); WD.printf(" Monitor");
STakayama 12:39e048e73819 110 //WD.locate(120,140);WD.foreground(Red ); WD.printf("JDI");
STakayama 12:39e048e73819 111 disp_logo();
STakayama 5:79dc134e6033 112 WD.writeDISP();
STakayama 6:aaba08f73be5 113 _lcd_extmod = 1; // 1=Pin,0=Serial
STakayama 13:9fb661dd4b2a 114 WD.background(Cyan);
STakayama 3:79758cbd4a92 115 return 0;
STakayama 5:79dc134e6033 116 /**/
STakayama 3:79758cbd4a92 117 }
STakayama 0:dbc295c4383e 118
STakayama 10:525bcf8907fc 119 ///////////////////////////////////////////////
STakayama 10:525bcf8907fc 120 int main() {
STakayama 10:525bcf8907fc 121 uint32_t eco2, tvoc;
STakayama 10:525bcf8907fc 122 float pressure, temperature2;
STakayama 10:525bcf8907fc 123 int32_t temperature;
STakayama 10:525bcf8907fc 124 uint32_t humidity;
STakayama 10:525bcf8907fc 125 float light, uv;
STakayama 10:525bcf8907fc 126 float acc_x, acc_y, acc_z, gyr_x, gyr_y, gyr_z, temperature3;
STakayama 10:525bcf8907fc 127
STakayama 10:525bcf8907fc 128 bool lightsensor_en = true;
STakayama 10:525bcf8907fc 129 bool gassensor_en = true;
STakayama 10:525bcf8907fc 130 bool hallsensor_en = true;
STakayama 10:525bcf8907fc 131 bool rhtsensor_en = true;
STakayama 10:525bcf8907fc 132 bool pressuresensor_en = true;
STakayama 10:525bcf8907fc 133 bool imu_en = false;
STakayama 10:525bcf8907fc 134
STakayama 10:525bcf8907fc 135 _pk1=1;
STakayama 12:39e048e73819 136 lcd_init();
STakayama 12:39e048e73819 137 ccs_en = 0; wait_ms(100);
STakayama 10:525bcf8907fc 138 ccs_en = 1;
STakayama 12:39e048e73819 139 wait_ms(2000);
STakayama 10:525bcf8907fc 140
STakayama 10:525bcf8907fc 141 /* Initialize air quality sensor */
STakayama 10:525bcf8907fc 142 AMS_CCS811* gasSensor = new AMS_CCS811(&ccs_i2c, PF15);
STakayama 10:525bcf8907fc 143 if(!gasSensor->init()) {
STakayama 10:525bcf8907fc 144 printf("Failed CCS811 init\r\n");
STakayama 10:525bcf8907fc 145 gassensor_en = false;
STakayama 10:525bcf8907fc 146 } else {
STakayama 10:525bcf8907fc 147 if(!gasSensor->mode(AMS_CCS811::TEN_SECOND)) {
STakayama 10:525bcf8907fc 148 printf("Failed to set CCS811 mode\r\n");
STakayama 10:525bcf8907fc 149 gassensor_en = false;
STakayama 6:aaba08f73be5 150 }
STakayama 10:525bcf8907fc 151 }
STakayama 10:525bcf8907fc 152
STakayama 10:525bcf8907fc 153 wait_ms(10);
STakayama 10:525bcf8907fc 154
STakayama 10:525bcf8907fc 155 /* Initialize barometer and RHT */
STakayama 10:525bcf8907fc 156 BMP280* pressureSensor = new BMP280(env_i2c);
STakayama 10:525bcf8907fc 157 Si7021* rhtSensor = new Si7021(PC4, PC5);
STakayama 10:525bcf8907fc 158
STakayama 10:525bcf8907fc 159 printf("\r\n\r\nHello Thunderboard Sense 2...\r\n");
STakayama 10:525bcf8907fc 160
STakayama 10:525bcf8907fc 161 /* Check if hall sensor is alive */
STakayama 10:525bcf8907fc 162 silabs::Si7210* hallSensor = new silabs::Si7210(&hall_i2c);
STakayama 10:525bcf8907fc 163 uint8_t id;
STakayama 10:525bcf8907fc 164 hallSensor->wakeup();
STakayama 10:525bcf8907fc 165 hallSensor->readRegister(SI72XX_HREVID, &id);
STakayama 10:525bcf8907fc 166 printf("Hall ID: %d\r\n", id);
STakayama 10:525bcf8907fc 167
STakayama 10:525bcf8907fc 168 /* Initialize light sensor */
STakayama 10:525bcf8907fc 169 Si1133* lightSensor = new Si1133(PC4, PC5);
STakayama 10:525bcf8907fc 170
STakayama 10:525bcf8907fc 171 if(!lightSensor->open()) {
STakayama 10:525bcf8907fc 172 printf("Something is wrong with Si1133, disabling...\n");
STakayama 10:525bcf8907fc 173 lightsensor_en = false;
STakayama 10:525bcf8907fc 174 } else printf("Si1133 available\n\r");
STakayama 10:525bcf8907fc 175
STakayama 10:525bcf8907fc 176 /* Initialize the IMU*/
STakayama 10:525bcf8907fc 177 printf("ICM20648 Start \n\r");
STakayama 10:525bcf8907fc 178
STakayama 10:525bcf8907fc 179 ICM20648* imu = new ICM20648(PC0, PC1, PC2, PC3, PF12);
STakayama 10:525bcf8907fc 180 printf(" ICM20648 OK\n\r");
STakayama 10:525bcf8907fc 181
STakayama 10:525bcf8907fc 182 if (imu != 0){
STakayama 10:525bcf8907fc 183 if(!imu->open()) {
STakayama 10:525bcf8907fc 184 printf("Something is wrong with ICM20648, disabling...\n");
STakayama 10:525bcf8907fc 185 imu_en = false;
STakayama 10:525bcf8907fc 186 } else printf("ICM20648 available\n\r");
STakayama 10:525bcf8907fc 187 }
STakayama 10:525bcf8907fc 188 WD.foreground(Red);
STakayama 10:525bcf8907fc 189 WD.set_font((unsigned char*) HGP15x19);
STakayama 10:525bcf8907fc 190 #define WD_OFFSET 10
STakayama 10:525bcf8907fc 191 do {
STakayama 10:525bcf8907fc 192 WD.clsBUF();
STakayama 10:525bcf8907fc 193 printf("----------------------------------------------\r\n");
STakayama 10:525bcf8907fc 194 /* Measure temperature and humidity */
STakayama 10:525bcf8907fc 195 if(rhtsensor_en) {
STakayama 10:525bcf8907fc 196 rhtSensor->measure();
STakayama 10:525bcf8907fc 197 rhtSensor->measure();
STakayama 10:525bcf8907fc 198 temperature = rhtSensor->get_temperature();
STakayama 10:525bcf8907fc 199 humidity = rhtSensor->get_humidity();
STakayama 10:525bcf8907fc 200
STakayama 10:525bcf8907fc 201 printf("temperature and humidity(Si7021):\r\n");
STakayama 10:525bcf8907fc 202 printf("temperature: %ld.%03ld degC\r\n", temperature/1000, abs(temperature%1000));
STakayama 10:525bcf8907fc 203 printf("humidity : %ld.%03ld %%\r\n", humidity/1000, humidity%1000);
STakayama 10:525bcf8907fc 204 WD.locate( 2,0*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("Temp.");
STakayama 10:525bcf8907fc 205 WD.locate(55,0*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%ld.%03ld degC", temperature/1000, abs(temperature%1000));
STakayama 10:525bcf8907fc 206 WD.locate( 2,1*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("Humi.");
STakayama 10:525bcf8907fc 207 WD.locate(55,1*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%ld.%03ld %%", humidity/1000, humidity%1000);
STakayama 6:aaba08f73be5 208 }
STakayama 10:525bcf8907fc 209
STakayama 10:525bcf8907fc 210 /* Measure barometric pressure */
STakayama 10:525bcf8907fc 211 if(pressuresensor_en) {
STakayama 10:525bcf8907fc 212 temperature2 = pressureSensor->getTemperature();
STakayama 10:525bcf8907fc 213 pressure = pressureSensor->getPressure();
STakayama 10:525bcf8907fc 214
STakayama 10:525bcf8907fc 215 printf("pressure(BMP280):\r\n");
STakayama 10:525bcf8907fc 216 printf("pressure : %.2f bar\r\n", pressure);
STakayama 10:525bcf8907fc 217 printf("temperature: %.2f degC\r\n", temperature2);
STakayama 10:525bcf8907fc 218 WD.locate( 2,2*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("Pres.");
STakayama 10:525bcf8907fc 219 WD.locate(55,2*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%.2f bar\r\n", pressure);
STakayama 10:525bcf8907fc 220 }
STakayama 10:525bcf8907fc 221
STakayama 10:525bcf8907fc 222 /* Measure air quality */
STakayama 10:525bcf8907fc 223 if(gassensor_en) {
STakayama 10:525bcf8907fc 224 gasSensor->has_new_data();
STakayama 10:525bcf8907fc 225 eco2 = gasSensor->co2_read();
STakayama 10:525bcf8907fc 226 tvoc = gasSensor->tvoc_read();
STakayama 10:525bcf8907fc 227
STakayama 10:525bcf8907fc 228 printf("air quality(CCS811):\r\n");
STakayama 10:525bcf8907fc 229 printf("CO2: %ld ppm\r\n", eco2);
STakayama 10:525bcf8907fc 230 printf("VoC: %ld ppb\r\n", tvoc);
STakayama 10:525bcf8907fc 231 WD.locate( 2,3*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("CO2");
STakayama 10:525bcf8907fc 232 WD.locate(55,3*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%ld ppm", eco2);
STakayama 10:525bcf8907fc 233 WD.locate( 2,4*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("VoC");
STakayama 10:525bcf8907fc 234 WD.locate(55,4*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%ld ppb", tvoc);
STakayama 10:525bcf8907fc 235 }
STakayama 10:525bcf8907fc 236
STakayama 10:525bcf8907fc 237 /* measure HALL */
STakayama 10:525bcf8907fc 238 if(hallsensor_en) {
STakayama 10:525bcf8907fc 239 hallSensor->measureOnce();
STakayama 10:525bcf8907fc 240 printf("HALL(Si7210):\r\n");
STakayama 10:525bcf8907fc 241 printf("T: %d.%02d degC\r\n", hallSensor->getTemperature()/1000, abs(hallSensor->getTemperature()%1000));
STakayama 10:525bcf8907fc 242 printf("F: %i.%03d mT\r\n", (int)(hallSensor->getFieldStrength()/1000), abs(hallSensor->getFieldStrength() % 1000));
STakayama 10:525bcf8907fc 243 WD.locate( 2,5*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("Magn.");
STakayama 10:525bcf8907fc 244 WD.locate(55,5*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%i.%03d mT\r\n", (int)(hallSensor->getFieldStrength()/1000), abs(hallSensor->getFieldStrength() % 1000));
STakayama 10:525bcf8907fc 245 }
STakayama 10:525bcf8907fc 246
STakayama 10:525bcf8907fc 247 /* measure light */
STakayama 10:525bcf8907fc 248 if(lightsensor_en) {
STakayama 10:525bcf8907fc 249 lightSensor->get_light_and_uv(&light, &uv);
STakayama 10:525bcf8907fc 250
STakayama 10:525bcf8907fc 251 printf("Light(BMP280):\r\n");
STakayama 10:525bcf8907fc 252 printf("Light: %.2f lux\r\n", light);
STakayama 10:525bcf8907fc 253 printf("UV : %.2f \r\n", uv);
STakayama 10:525bcf8907fc 254 WD.locate( 2,6*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("Lumi.");
STakayama 10:525bcf8907fc 255 WD.locate(55,6*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%.2f lux", light);
STakayama 10:525bcf8907fc 256 WD.locate( 2,7*20+WD_OFFSET);WD.foreground(Blue ); WD.printf("UV");
STakayama 10:525bcf8907fc 257 WD.locate(55,7*20+WD_OFFSET);WD.foreground(Red ); WD.printf("%.2f", uv);
STakayama 10:525bcf8907fc 258 }
STakayama 10:525bcf8907fc 259
STakayama 10:525bcf8907fc 260 /* measure imu */
STakayama 10:525bcf8907fc 261 if(imu_en) {
STakayama 10:525bcf8907fc 262 imu->get_temperature(&temperature3);
STakayama 10:525bcf8907fc 263 imu->get_accelerometer(&acc_x, &acc_y, &acc_z);
STakayama 10:525bcf8907fc 264 imu->get_gyroscope(&gyr_x, &gyr_y, &gyr_z);
STakayama 10:525bcf8907fc 265
STakayama 10:525bcf8907fc 266 printf("ICM20648:\r\n");
STakayama 10:525bcf8907fc 267 printf("TEMP: %.2f degC\r\n", temperature3);
STakayama 10:525bcf8907fc 268 printf("Acc : %.2f %.2f %.2f\r\n", acc_x, acc_y, acc_z);
STakayama 10:525bcf8907fc 269 printf("Gyro: %.2f %.2f %.2f\r\n", gyr_x, gyr_y, gyr_z);
STakayama 10:525bcf8907fc 270 WD.locate(2,8*20+WD_OFFSET); WD.printf("Acc : %.2f %.2f %.2f\r\n", acc_x, acc_y, acc_z);
STakayama 10:525bcf8907fc 271 WD.locate(2,9*20+WD_OFFSET); WD.printf("Gyro: %.2f %.2f %.2f\r\n", gyr_x, gyr_y, gyr_z);
STakayama 10:525bcf8907fc 272 }
STakayama 10:525bcf8907fc 273 WD.writeDISP();
STakayama 10:525bcf8907fc 274 _lcd_extcom = !_lcd_extcom;
STakayama 10:525bcf8907fc 275 wait(1);
STakayama 10:525bcf8907fc 276 } while(1);
STakayama 0:dbc295c4383e 277 }