sakura.io Evalution board's example.

Dependencies:   AQM0802A BME280 MPU9250_SPI SakuraIO gps mbed

Fork of SakuraIO_Evaluation_Board_Standard by SAKURA Internet

sakura.io Evalution board's sample program. Collecting the onboard sensors(GPS, 9axis motion sensor, Environment sensor), send to sakura.io service.

Committer:
okuhara
Date:
Thu Jul 26 05:01:46 2018 +0000
Revision:
6:a9369ce445b3
Parent:
5:e3ae6eb55256
Update comments.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
misodengaku 0:db3ec2781484 1 #include <mbed.h>
misodengaku 0:db3ec2781484 2 #include <AQM0802A.h>
misodengaku 0:db3ec2781484 3 #include <BME280.h>
misodengaku 0:db3ec2781484 4 #include <MPU9250.h>
misodengaku 0:db3ec2781484 5 #include <SakuraIO.h>
misodengaku 0:db3ec2781484 6 #include "SakuraPinNames.h"
misodengaku 0:db3ec2781484 7 #include "sensors.h"
misodengaku 1:faf04d99f302 8 #include "gps.h"
misodengaku 0:db3ec2781484 9
misodengaku 0:db3ec2781484 10 // Serial over CMSIS_DAP
misodengaku 0:db3ec2781484 11 Serial pc(DAP_UART_TX, DAP_UART_RX, 9600);
misodengaku 0:db3ec2781484 12
misodengaku 0:db3ec2781484 13 // GPS
misodengaku 0:db3ec2781484 14 Serial gps(GPS_TX, GPS_RX, 9600);
misodengaku 0:db3ec2781484 15 DigitalOut gps_en(GPS_EN);
misodengaku 0:db3ec2781484 16
misodengaku 0:db3ec2781484 17 // LED
misodengaku 0:db3ec2781484 18 DigitalOut led_1(LED1);
misodengaku 0:db3ec2781484 19 DigitalOut led_2(LED2);
misodengaku 0:db3ec2781484 20 DigitalOut led_3(LED3);
misodengaku 0:db3ec2781484 21 DigitalOut led_4(LED4);
misodengaku 0:db3ec2781484 22
misodengaku 0:db3ec2781484 23 // LCD backlight
misodengaku 0:db3ec2781484 24 DigitalOut lcd_led(LED_LCD);
misodengaku 0:db3ec2781484 25
misodengaku 0:db3ec2781484 26 // Switch
misodengaku 0:db3ec2781484 27 DigitalIn sw_1(SW1);
misodengaku 0:db3ec2781484 28 DigitalIn sw_2(SW2);
misodengaku 0:db3ec2781484 29 DigitalIn sw_3(SW3);
misodengaku 0:db3ec2781484 30 DigitalIn sw_4(SW4);
misodengaku 0:db3ec2781484 31 DigitalIn sw_5(SW5);
misodengaku 0:db3ec2781484 32 DigitalIn sw_6(SW6);
misodengaku 0:db3ec2781484 33
misodengaku 0:db3ec2781484 34 // Internal I2C
misodengaku 0:db3ec2781484 35 I2C internal_i2c(I2C_INTERNAL_SDA, I2C_INTERNAL_SCL);
misodengaku 0:db3ec2781484 36 AQM0802A lcd(internal_i2c);
misodengaku 0:db3ec2781484 37 BME280 bme280(internal_i2c);
misodengaku 0:db3ec2781484 38
misodengaku 0:db3ec2781484 39 // SPI
misodengaku 0:db3ec2781484 40 SPI internal_mpu9250_spi(SPI_MPU_MOSI, SPI_MPU_MISO, SPI_MPU_SCK);
misodengaku 0:db3ec2781484 41 mpu9250_spi mpu9250(internal_mpu9250_spi, SPI_MPU_CS);
misodengaku 0:db3ec2781484 42
misodengaku 0:db3ec2781484 43 // sakura.io
okuhara 6:a9369ce445b3 44 //SakuraIO_I2C sakuraio(I2C_SDA, I2C_SCL);
okuhara 6:a9369ce445b3 45 SPI sakuraio_spi(PB_15, PB_14, PB_13);
okuhara 6:a9369ce445b3 46 DigitalOut sakuraio_cs(PB_12);
okuhara 6:a9369ce445b3 47 SakuraIO_SPI sakuraio(sakuraio_spi, sakuraio_cs);
misodengaku 0:db3ec2781484 48
misodengaku 0:db3ec2781484 49 SensorData sensor_data;
misodengaku 0:db3ec2781484 50
misodengaku 1:faf04d99f302 51 // GPS UART buffer
misodengaku 1:faf04d99f302 52 char uart_buffer[128] = {0};
misodengaku 1:faf04d99f302 53 int uart_buffer_index = 0;
misodengaku 1:faf04d99f302 54
misodengaku 1:faf04d99f302 55 // NMEA Decoder
misodengaku 1:faf04d99f302 56 GPSDecoder gps_decoder;
misodengaku 1:faf04d99f302 57
misodengaku 1:faf04d99f302 58 void gps_uart_buffering_handler();
misodengaku 0:db3ec2781484 59
okuhara 3:e5e53c1f6fda 60 const int SEND_INTERVAL_TICKS_PAR_COUNT = 1500;
okuhara 3:e5e53c1f6fda 61
misodengaku 0:db3ec2781484 62 void setup()
misodengaku 0:db3ec2781484 63 {
misodengaku 0:db3ec2781484 64 lcd_led = 1;
misodengaku 0:db3ec2781484 65 pc.printf("Hello World !\r\n");
misodengaku 0:db3ec2781484 66 lcd.cls();
misodengaku 0:db3ec2781484 67 lcd.printf("Hello");
misodengaku 0:db3ec2781484 68
misodengaku 0:db3ec2781484 69 // Initialize sensors
misodengaku 0:db3ec2781484 70 bme280.initialize();
misodengaku 0:db3ec2781484 71 pc.printf("BME280 ok.\r\n");
misodengaku 0:db3ec2781484 72 mpu9250.init(1, BITS_DLPF_CFG_188HZ);
misodengaku 0:db3ec2781484 73 pc.printf("MPU9250 ok. WHOAMI=%02x\r\n", mpu9250.whoami());
misodengaku 0:db3ec2781484 74 if (mpu9250.whoami() != 0x71) {
misodengaku 0:db3ec2781484 75 pc.printf("[ERROR] MPU9250 init fail.\r\n");
misodengaku 0:db3ec2781484 76 }
misodengaku 0:db3ec2781484 77
misodengaku 0:db3ec2781484 78 mpu9250.set_gyro_scale(BITS_FS_2000DPS); //Set full scale range for gyros
misodengaku 0:db3ec2781484 79 mpu9250.set_acc_scale(BITS_FS_16G); //Set full scale range for accs
misodengaku 0:db3ec2781484 80 mpu9250.calib_acc();
misodengaku 0:db3ec2781484 81 mpu9250.AK8963_calib_Magnetometer();
misodengaku 0:db3ec2781484 82
misodengaku 1:faf04d99f302 83 // active high
misodengaku 0:db3ec2781484 84 gps_en = 1;
misodengaku 1:faf04d99f302 85 gps.attach(&gps_uart_buffering_handler, Serial::RxIrq);
okuhara 3:e5e53c1f6fda 86
okuhara 3:e5e53c1f6fda 87 led_1 = 1;
okuhara 3:e5e53c1f6fda 88 led_2 = 0;
okuhara 3:e5e53c1f6fda 89
okuhara 3:e5e53c1f6fda 90 pc.printf("Send par %d seconds.\r\n", (SEND_INTERVAL_TICKS_PAR_COUNT * 200) / 1000);
misodengaku 0:db3ec2781484 91 }
misodengaku 0:db3ec2781484 92
misodengaku 0:db3ec2781484 93 void read_sensor_data()
misodengaku 0:db3ec2781484 94 {
misodengaku 0:db3ec2781484 95 sensor_data.bme280.temperature = bme280.getTemperature();
misodengaku 0:db3ec2781484 96 sensor_data.bme280.pressure = bme280.getPressure();
misodengaku 0:db3ec2781484 97 sensor_data.bme280.humidity = bme280.getHumidity();
misodengaku 0:db3ec2781484 98
misodengaku 0:db3ec2781484 99 mpu9250.read_all();
misodengaku 0:db3ec2781484 100 sensor_data.mpu9250.temperature = mpu9250.Temperature;
okuhara 3:e5e53c1f6fda 101 for (int cnt_send = 0; cnt_send < 3; cnt_send++) {
okuhara 3:e5e53c1f6fda 102 sensor_data.mpu9250.accelerometer[cnt_send] = mpu9250.accelerometer_data[cnt_send];
okuhara 3:e5e53c1f6fda 103 sensor_data.mpu9250.gyroscope[cnt_send] = mpu9250.gyroscope_data[cnt_send];
okuhara 3:e5e53c1f6fda 104 sensor_data.mpu9250.magnetometer[cnt_send] = mpu9250.Magnetometer[cnt_send];
misodengaku 0:db3ec2781484 105 }
misodengaku 0:db3ec2781484 106 }
misodengaku 0:db3ec2781484 107
misodengaku 0:db3ec2781484 108 void enqueue_sensor_data(int counter)
misodengaku 0:db3ec2781484 109 {
okuhara 3:e5e53c1f6fda 110 sakuraio.enqueueTx(0, (int32_t)counter);
misodengaku 0:db3ec2781484 111 sakuraio.enqueueTx(1, sensor_data.bme280.temperature);
misodengaku 0:db3ec2781484 112 sakuraio.enqueueTx(2, sensor_data.bme280.pressure);
misodengaku 0:db3ec2781484 113 sakuraio.enqueueTx(3, sensor_data.bme280.humidity);
misodengaku 1:faf04d99f302 114 sakuraio.enqueueTx(4, sensor_data.mpu9250.accelerometer[0]);
misodengaku 1:faf04d99f302 115 sakuraio.enqueueTx(5, sensor_data.mpu9250.accelerometer[1]);
misodengaku 1:faf04d99f302 116 sakuraio.enqueueTx(6, sensor_data.mpu9250.accelerometer[2]);
misodengaku 1:faf04d99f302 117 sakuraio.enqueueTx(7, sensor_data.mpu9250.gyroscope[0]);
misodengaku 1:faf04d99f302 118 sakuraio.enqueueTx(8, sensor_data.mpu9250.gyroscope[1]);
misodengaku 1:faf04d99f302 119 sakuraio.enqueueTx(9, sensor_data.mpu9250.gyroscope[2]);
misodengaku 1:faf04d99f302 120 sakuraio.enqueueTx(10, sensor_data.mpu9250.magnetometer[0]);
misodengaku 1:faf04d99f302 121 sakuraio.enqueueTx(11, sensor_data.mpu9250.magnetometer[1]);
misodengaku 1:faf04d99f302 122 sakuraio.enqueueTx(12, sensor_data.mpu9250.magnetometer[2]);
misodengaku 1:faf04d99f302 123 sakuraio.enqueueTx(13, gps_decoder.get_longitude());
misodengaku 1:faf04d99f302 124 sakuraio.enqueueTx(14, gps_decoder.get_latitude());
misodengaku 1:faf04d99f302 125 sakuraio.enqueueTx(15, gps_decoder.get_unixtime());
misodengaku 1:faf04d99f302 126 }
misodengaku 1:faf04d99f302 127
misodengaku 1:faf04d99f302 128 void gps_uart_buffering_handler()
misodengaku 1:faf04d99f302 129 {
misodengaku 1:faf04d99f302 130 while (gps.readable() == 1) {
misodengaku 1:faf04d99f302 131 char c = gps.getc();
misodengaku 1:faf04d99f302 132 if (c == '\r') {
misodengaku 1:faf04d99f302 133 continue;
misodengaku 1:faf04d99f302 134 }
misodengaku 1:faf04d99f302 135 uart_buffer[uart_buffer_index] = c;
misodengaku 1:faf04d99f302 136 uart_buffer_index++;
misodengaku 1:faf04d99f302 137 if (c == '\n') {
misodengaku 1:faf04d99f302 138 uart_buffer[uart_buffer_index - 1] = '\0';
misodengaku 1:faf04d99f302 139 gps_decoder.set_nmea_message(uart_buffer);
misodengaku 1:faf04d99f302 140 gps_decoder.decode();
misodengaku 1:faf04d99f302 141 uart_buffer_index = 0;
misodengaku 1:faf04d99f302 142 }
misodengaku 1:faf04d99f302 143 }
misodengaku 0:db3ec2781484 144 }
misodengaku 0:db3ec2781484 145
misodengaku 0:db3ec2781484 146
misodengaku 0:db3ec2781484 147 void loop()
misodengaku 0:db3ec2781484 148 {
okuhara 3:e5e53c1f6fda 149 static int cnt_send = 1;
okuhara 3:e5e53c1f6fda 150 static int tick_by_200ms = 0;
okuhara 3:e5e53c1f6fda 151 static int stat_sw5 = -1;
okuhara 3:e5e53c1f6fda 152
okuhara 3:e5e53c1f6fda 153 if((sakuraio.getConnectionStatus() & 0x80) == 0x00) {
okuhara 3:e5e53c1f6fda 154 //Offline
okuhara 5:e3ae6eb55256 155 stat_sw5 = -1;
okuhara 3:e5e53c1f6fda 156 lcd.cls();
okuhara 3:e5e53c1f6fda 157 lcd.printf("Offline");
okuhara 3:e5e53c1f6fda 158 pc.printf("Network is offline.\r\n(After 1 sec to running retry.)\r\n");
okuhara 3:e5e53c1f6fda 159 wait(1);
okuhara 3:e5e53c1f6fda 160 return;
okuhara 3:e5e53c1f6fda 161 }
misodengaku 1:faf04d99f302 162
okuhara 3:e5e53c1f6fda 163 if (stat_sw5 != sw_5) {
okuhara 3:e5e53c1f6fda 164 stat_sw5 = sw_5;
okuhara 3:e5e53c1f6fda 165 led_3 = stat_sw5; //State: `Send Enable'
okuhara 3:e5e53c1f6fda 166 if (stat_sw5 == 0) {
okuhara 3:e5e53c1f6fda 167 lcd.cls();
okuhara 3:e5e53c1f6fda 168 lcd.printf("Send:OFF");
okuhara 3:e5e53c1f6fda 169 } else {
okuhara 3:e5e53c1f6fda 170 cnt_send = 1;
okuhara 3:e5e53c1f6fda 171 tick_by_200ms = 0;
okuhara 3:e5e53c1f6fda 172 lcd.cls();
okuhara 3:e5e53c1f6fda 173 lcd.printf("Send:ON");
okuhara 3:e5e53c1f6fda 174 }
misodengaku 0:db3ec2781484 175 }
okuhara 3:e5e53c1f6fda 176
okuhara 3:e5e53c1f6fda 177 if (stat_sw5 == 1) {
okuhara 6:a9369ce445b3 178 if ((tick_by_200ms % SEND_INTERVAL_TICKS_PAR_COUNT) == 0) { //Send data intarval is 5 minutes.
okuhara 3:e5e53c1f6fda 179 pc.printf("\r\n\r\n--------------------\r\n");
okuhara 3:e5e53c1f6fda 180 read_sensor_data();
okuhara 3:e5e53c1f6fda 181 pc.printf("BME280\r\n");
okuhara 3:e5e53c1f6fda 182 pc.printf("\tTemp: %.2fC\r\n", sensor_data.bme280.temperature);
okuhara 3:e5e53c1f6fda 183 pc.printf("\tPres: %.2fhPa\r\n", sensor_data.bme280.pressure);
okuhara 3:e5e53c1f6fda 184 pc.printf("\tHum: %.2f%%\r\n", sensor_data.bme280.humidity);
okuhara 3:e5e53c1f6fda 185 pc.printf("MPU9250\r\n");
okuhara 3:e5e53c1f6fda 186 pc.printf("\tTemp: %.2fC\r\n", sensor_data.mpu9250.temperature);
okuhara 3:e5e53c1f6fda 187 for (int j = 0; j < 3; j++) {
okuhara 3:e5e53c1f6fda 188 pc.printf("\tacc[%d]: %.2f\r\n", j, sensor_data.mpu9250.accelerometer[j]);
okuhara 3:e5e53c1f6fda 189 pc.printf("\tgyro[%d]: %.2f\r\n", j, sensor_data.mpu9250.gyroscope[j]);
okuhara 3:e5e53c1f6fda 190 pc.printf("\tmag[%d]: %.2f\r\n", j, sensor_data.mpu9250.magnetometer[j]);
okuhara 3:e5e53c1f6fda 191 }
okuhara 3:e5e53c1f6fda 192 pc.printf("GPS\r\n");
okuhara 3:e5e53c1f6fda 193 pc.printf("\tlat: %f%c\r\n",
okuhara 3:e5e53c1f6fda 194 gps_decoder.get_latitude(),
okuhara 3:e5e53c1f6fda 195 gps_decoder.get_latitude() >= 0 ? 'N' : 'S');
okuhara 3:e5e53c1f6fda 196 pc.printf("\tlon: %f%c\r\n",
okuhara 3:e5e53c1f6fda 197 gps_decoder.get_longitude(),
okuhara 3:e5e53c1f6fda 198 gps_decoder.get_longitude() >= 0 ? 'E' : 'W');
okuhara 3:e5e53c1f6fda 199 pc.printf("\tspeed: %fkm/h\r\n", gps_decoder.get_speed());
okuhara 3:e5e53c1f6fda 200 pc.printf("\tmove_direction: %f\r\n", gps_decoder.get_move_direction());
okuhara 3:e5e53c1f6fda 201 pc.printf("\tdate: %d/%02d/%02d %02d:%02d:%02d (UTC)\r\n",
okuhara 3:e5e53c1f6fda 202 gps_decoder.get_year(), gps_decoder.get_month(), gps_decoder.get_day(),
okuhara 3:e5e53c1f6fda 203 gps_decoder.get_hour(), gps_decoder.get_min(), gps_decoder.get_sec());
okuhara 3:e5e53c1f6fda 204 pc.printf("\tUNIX time: %d\r\n", gps_decoder.get_unixtime());
okuhara 3:e5e53c1f6fda 205 if ((sakuraio.getConnectionStatus() & 0x80) == 0x80) {
okuhara 3:e5e53c1f6fda 206 led_2 = 1;
okuhara 3:e5e53c1f6fda 207 pc.printf("Send:%d\r\n", cnt_send);
okuhara 3:e5e53c1f6fda 208 lcd.setCursor(0, 1);
okuhara 3:e5e53c1f6fda 209 lcd.printf("%d", cnt_send);
okuhara 3:e5e53c1f6fda 210 enqueue_sensor_data(cnt_send);
okuhara 3:e5e53c1f6fda 211 sakuraio.send();
okuhara 3:e5e53c1f6fda 212 cnt_send++;
okuhara 3:e5e53c1f6fda 213 led_2 = 0;
okuhara 3:e5e53c1f6fda 214 pc.printf("After %d sec to send.\r\n", (int)(SEND_INTERVAL_TICKS_PAR_COUNT * 0.2));
okuhara 3:e5e53c1f6fda 215 } else {
okuhara 3:e5e53c1f6fda 216 return;
okuhara 3:e5e53c1f6fda 217 }
okuhara 3:e5e53c1f6fda 218 }
misodengaku 0:db3ec2781484 219 }
misodengaku 0:db3ec2781484 220 led_1 = !led_1;
misodengaku 0:db3ec2781484 221 led_4 = !sw_4;
okuhara 3:e5e53c1f6fda 222 tick_by_200ms++;
okuhara 3:e5e53c1f6fda 223 wait(0.2);
misodengaku 0:db3ec2781484 224 }
misodengaku 0:db3ec2781484 225
misodengaku 0:db3ec2781484 226
misodengaku 0:db3ec2781484 227 int main()
misodengaku 0:db3ec2781484 228 {
misodengaku 0:db3ec2781484 229 setup();
misodengaku 0:db3ec2781484 230 while(1) {
misodengaku 0:db3ec2781484 231 loop();
misodengaku 0:db3ec2781484 232 }
okuhara 3:e5e53c1f6fda 233 }