Ina hackathon 2nd
Dependencies: ADXL345_I2C Chainable_RGB_LED EEAB-P1 MMA8652FC Sht31 TinyGPS mbed
Fork of ina-hack-test by
main.cpp
00001 #include "mbed.h" 00002 #include "TinyGPS.h" 00003 #include "Eeabp1.h" 00004 #include "ChainableLED.h" 00005 00006 #define TEST_LORA 00007 //#define TEST_ANALOG // WaterSensor(ハイインピ過ぎる),SoundSensor(動くが設計に問題有),MoistureSensor,LightSensor,MotionSensor 00008 //#define TEST_TEMP_HUMID //SHT31 00009 //#define TEST_ACC // ADXL345 00010 //#define TEST_DIGITAL_IN // Button,Switch 00011 //#define TEST_DIGITAL_OUT // Buzzer,LED 00012 //#define TEST_DIGITAL_IN_INTTERUPT 00013 00014 // 00015 // RGBLED Support 00016 // 00017 ChainableLED color_led(P0_13, P0_12, 1); // ChainableLED(clk, data, number_of_leds) 00018 00019 // 00020 // 1Wire Support 00021 // 00022 I2C i2c(P0_30, P0_7); 00023 00024 // 指定アドレスにアクセスする 00025 static void SendRegDataI2c(uint8_t address, uint8_t regdata) 00026 { 00027 i2c.start(); 00028 i2c.write((address << 1)); 00029 i2c.write(regdata); 00030 i2c.stop(); 00031 wait_us(1000); 00032 } 00033 00034 // 指定アドレスに1バイトデータを送信する 00035 static void SendRegByteDataI2c(uint8_t address, uint8_t regaddr, uint8_t data) 00036 { 00037 i2c.start(); 00038 i2c.write((address << 1)); 00039 i2c.write(regaddr); 00040 i2c.write(data); 00041 i2c.stop(); 00042 wait_us(1000); 00043 } 00044 00045 static void RecieveDataI2c(uint8_t address, uint8_t reg1, uint8_t reg2, uint8_t* data, uint8_t datacount) 00046 { 00047 i2c.start(); 00048 i2c.write((address << 1)); 00049 i2c.write(reg1); 00050 i2c.write(reg2); 00051 i2c.start(); 00052 i2c.write((address << 1) + 1); 00053 00054 if (datacount == 1) { 00055 *data = i2c.read(false); 00056 } else { 00057 int i = 0; 00058 for (i = 0; i < datacount - 1; i++) { 00059 *(data + i) = i2c.read(false); 00060 } 00061 *(data + datacount - 1) = i2c.read(true); 00062 } 00063 i2c.stop(); 00064 wait_us(1000); 00065 00066 } 00067 00068 static void Reset1Wire() 00069 { 00070 SendRegDataI2c(0x18, 0xF0); // Device Reset (After Power-Up) 00071 } 00072 00073 static float GetTempFrom1Wire() 00074 { 00075 SendRegDataI2c(0x18, 0xB4); // 1-Wire Reset (To Begin or End 1-Wire Communication) 00076 wait_us(10000); 00077 SendRegByteDataI2c(0x18, 0xA5, 0xCC); // CCh SKIP ROM COMMAND 00078 SendRegByteDataI2c(0x18, 0xA5, 0x44); // 44h CONVERT TEMPERATURE 00079 wait_us(10000); 00080 SendRegDataI2c(0x18, 0xB4); // 1-Wire Reset (To Begin or End 1-Wire Communication) 00081 wait_us(10000); 00082 SendRegByteDataI2c(0x18, 0xA5, 0xCC); // CCh SKIP ROM COMMAND 00083 SendRegByteDataI2c(0x18, 0xA5, 0xBE); // BEh READ SCRATCHPAD 00084 wait_us(10000); 00085 //Read from DS 00086 // LE 1-2バイト目が温度 0.0625℃精度 00087 uint8_t l = 0; 00088 uint8_t data[8]; 00089 for (l = 0; l < 8; l++) { 00090 SendRegDataI2c(0x18, 0x96); // 1-Wire Read Byte Command(0x96) 00091 wait_us(10000); 00092 RecieveDataI2c(0x18, 0xE1, 0xE1, &data[l], 1); // Read from Pointer's DATA(0xE1) 00093 wait_us(10000); 00094 } 00095 //board.debug("TEMP:0x%02X%02X\r\n",data[1],data[0]); 00096 int16_t tempp = data[0] + (data[1] << 8); 00097 return tempp*0.0625; 00098 } 00099 // 00100 // GPS Support 00101 // 00102 //#define GPSDEBUG 00103 TinyGPS gps; 00104 SPI spi(P0_25,P0_28,P0_29,P0_24); 00105 DigitalOut gpsreset(P0_21); 00106 DigitalOut gpspower(P0_20); 00107 bool isGpsInitFirst = true; 00108 bool gpsPowerOn = false; 00109 static bool needGpsRefresh; 00110 static uint8_t gpsTick; 00111 static long latitude, longitude; 00112 static int16_t altitude; 00113 static uint8_t spiData; 00114 #ifdef GPSDEBUG 00115 static uint8_t buffer[1024]; 00116 #endif 00117 static unsigned long fix_age; 00118 00119 static void gpsReset() 00120 { 00121 gpsreset= 0; 00122 wait_us(10000); 00123 gpsreset= 1; 00124 wait_us(200000); 00125 } 00126 00127 static void gpsTogglePower() 00128 { 00129 gpspower= 1; 00130 wait_us(200000); 00131 gpspower= 0; 00132 } 00133 // GPS電源を有効にします 00134 // 電源をOFFにした場合でも、GPS座標を保持する為に低電力状態で動作します。 00135 static void GpsPower(bool state) 00136 { 00137 if(state == true) { 00138 if(gpsPowerOn == false) { 00139 if(isGpsInitFirst == true) gpsReset();// GPS Reset(保持座標が全部消える) 00140 gpsTogglePower(); // GPS Wakeup(ToggleでON/OFFする) 00141 if(isGpsInitFirst == true) { 00142 // GPS用SPIを初期化する 00143 spi.format(8,1); 00144 spi.frequency(1000000); 00145 isGpsInitFirst = false; 00146 } 00147 gpsPowerOn = true; 00148 } 00149 } else { 00150 if(gpsPowerOn == true) { 00151 gpsTogglePower(); // GPS Wakeup(ToggleでON/OFFする) 00152 gpsPowerOn = false; 00153 } 00154 } 00155 } 00156 00157 // GPS処理用のループです 00158 // 2000ms以内のタイミングで必ず呼んで下さい 00159 static void LoopGps() 00160 { 00161 if(gpsPowerOn == true) { 00162 // データが無い時は、0xB4,0xA7を繰り返す 00163 // 有効なデータが来るまで、FIFOを最大1/4読む 00164 for(int j=0; j<512; j++) { 00165 spiData = spi.write(0x00); 00166 if(spiData != 0xB4 && spiData != 0xA7)break; 00167 } 00168 if(spiData == 0xB4 || spiData == 0xA7) return; // 有効なデータが無かった 00169 // NMEAをデコードする 00170 // 0xB4がSPIデータ終端 各NMEAセンテンスは0x0d,0x0Aでセパレートされている為、一度だけのリードで問題無い。 00171 #ifdef GPSDEBUG 00172 int i=0; 00173 buffer[i] = spiData; 00174 i++; 00175 #endif 00176 while(1) { 00177 spiData = spi.write(0x00); 00178 if(spiData == 0xB4) { // 終端検出 00179 #ifdef GPSDEBUG 00180 buffer[i] = 0x00; 00181 #endif 00182 break; 00183 } 00184 #ifdef GPSDEBUG 00185 buffer[i] = spiData; 00186 i++; 00187 #endif 00188 gps.encode(spiData); 00189 } 00190 gps.get_position(&latitude, &longitude, &fix_age); 00191 altitude = gps.altitude(); // 高度取得は正しく動かない? 00192 /* 00193 #ifdef GPSDEBUG 00194 pc.debug("%s", buffer); // NMEAデータ表示 00195 pc.debug("POS:%d,%d,%d\r\n", latitude,longitude,altitude); // GPS情報表示 00196 #endif 00197 */ 00198 // GPS状態判定の為、GPS座標を定期的にリセットする 00199 if(needGpsRefresh == true) { 00200 gps.reset_ready(); 00201 gps.reset_pos(); 00202 needGpsRefresh = false; 00203 } 00204 } 00205 } 00206 00207 #if defined(TEST_DIGITAL_IN_INTTERUPT) 00208 Eeabp1 *gp; 00209 bool led_on = true; 00210 00211 void flip() 00212 { 00213 if (led_on) 00214 gp->setLedState(LED_OFF); 00215 else 00216 gp->setLedState(LED_ON); 00217 led_on = !led_on; 00218 } 00219 #endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */ 00220 00221 int main(void) 00222 { 00223 Eeabp1 board; 00224 int ret = 0; 00225 00226 #if defined(TEST_DIGITAL_IN_INTTERUPT) 00227 gp = &board; 00228 led_on = true; 00229 #endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */ 00230 00231 board.setLedState(LED_ON); 00232 board.debug("Hello ina-hack!\r\n"); 00233 00234 board.setGrovePower(true); 00235 00236 /* 00237 // RGBLEDデモ 00238 // 本来はデータシート通り5Vで操作させないと色がおかしいが、 00239 // 3.3Vでも動作自体は問題無い 00240 uint8_t R = 50; 00241 uint8_t G = 100; 00242 uint8_t B = 200; 00243 board.setGrovePortType(GROVE_CH1, GROVE_DIO); 00244 board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_OUT); 00245 wait(0.1); 00246 // ChainableLED.setColorRGB(index_of_led, red, green, blue) 00247 color_led.setColorRGB(0, R, G, B); // increase brightness cascade down chain of LED's 00248 */ 00249 /* 00250 // GPSデモ 00251 GpsPower(true); // バッテリー駆動の場合、GPS電源をこまめに切ることを推奨します 00252 while(true) 00253 { 00254 LoopGps(); // バッファが溢れる迄(目安2秒)にこのループを回して下さい。 00255 board.debug("POS:%d,%d,%d\r\n", latitude,longitude,altitude); // GPS情報表示 00256 wait(1); 00257 // GPSの電波状況が悪くなった場合、最終座標で固定される 00258 // 10秒毎にGPSが測位できているか再確認する 00259 if(gpsTick >= 10) { 00260 gpsTick =0; 00261 needGpsRefresh = true; //このフラグを立てることによりリフレッシュする。 00262 } else { 00263 gpsTick ++; 00264 } 00265 } 00266 */ 00267 /* 00268 // 1Wireデモ 00269 while(1) 00270 { 00271 wait(1); 00272 board.debug("TEMP:%f\r\n", GetTempFrom1Wire()); 00273 } 00274 */ 00275 #if defined(TEST_DIGITAL_OUT) || defined(TEST_DIGITAL_IN) || defined(TEST_DIGITAL_IN_INTTERUPT) 00276 board.setGrovePortType(GROVE_CH1, GROVE_DIO); 00277 board.setGrovePortType(GROVE_CH2, GROVE_DIO); 00278 #endif 00279 #if defined(TEST_DIGITAL_OUT) 00280 board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_OUT); 00281 board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_OUT); 00282 #endif /* defined(TEST_DIGITAL_OUT) */ 00283 #if defined(TEST_DIGITAL_IN) 00284 board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_IN); 00285 board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_IN); 00286 #endif /* defined(TEST_DIGITAL_IN) */ 00287 #if defined(TEST_DIGITAL_IN_INTTERUPT) 00288 board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_IN, flip); 00289 board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_IN, flip); 00290 #endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */ 00291 #if defined(TEST_ANALOG) 00292 board.setGrovePortType(GROVE_CH1, GROVE_ANALOG); 00293 board.setGrovePortType(GROVE_CH2, GROVE_ANALOG); 00294 #endif /* defined(TEST_ANALOG) */ 00295 00296 #if defined(TEST_LORA) 00297 ret = board.setLoRaPower(true); 00298 if (ret != 0) { 00299 board.debug("error %d\r\n", ret); 00300 } 00301 #endif /* defined(TEST_LORA) */ 00302 #if defined(TEST_TEMP_HUMID) 00303 ret = board.enableTempHumidSensor(); 00304 if (ret != 0) 00305 board.debug("error %d\r\n", ret); 00306 #endif /* TEST_TEMP_HUMID */ 00307 #if defined(TEST_ACC) 00308 ret = board.enableAccelerometer(); 00309 if (ret != 0) 00310 board.debug("error %d\r\n", ret); 00311 #endif /* defined(TEST_ACC) */ 00312 00313 #if defined(TEST_LORA) 00314 int i = 0; 00315 #endif /* defined(TEST_LORA) */ 00316 #if defined(TEST_DIGITAL_OUT) 00317 bool on = true; 00318 #endif /* defined(TEST_DIGITAL_OUT) */ 00319 do { 00320 wait(10); 00321 board.loop(); 00322 #if defined(TEST_DIGITAL_OUT) 00323 if (on) { 00324 //board.setGroveDio(GROVE_CH1, GROVE_DIO_HIGH); // SIG1&2両方変更したい場合 00325 board.setGroveDio(GROVE_CH1, GROVE_SIG1 , GROVE_DIO_HIGH); 00326 board.setGroveDio(GROVE_CH1, GROVE_SIG2 , GROVE_DIO_LOW); 00327 board.setGroveDio(GROVE_CH2, GROVE_SIG1 , GROVE_DIO_HIGH); 00328 board.setGroveDio(GROVE_CH2, GROVE_SIG2 , GROVE_DIO_LOW); 00329 } else { 00330 board.setGroveDio(GROVE_CH1, GROVE_SIG1 , GROVE_DIO_LOW); 00331 board.setGroveDio(GROVE_CH1, GROVE_SIG2 , GROVE_DIO_HIGH); 00332 board.setGroveDio(GROVE_CH2, GROVE_SIG1 , GROVE_DIO_LOW); 00333 board.setGroveDio(GROVE_CH2, GROVE_SIG2 , GROVE_DIO_HIGH); 00334 } 00335 on = !on; 00336 #endif /* defined(TEST_DIGITAL_OUT) */ 00337 #if defined(TEST_DIGITAL_IN) 00338 board.debug("------------\r\n"); 00339 board.debug("P1 S1: %d\r\n", board.getGroveDio(GROVE_CH1, GROVE_SIG1)); 00340 board.debug("P1 S2: %d\r\n", board.getGroveDio(GROVE_CH1, GROVE_SIG2)); 00341 board.debug("P2 S1: %d\r\n", board.getGroveDio(GROVE_CH2, GROVE_SIG1)); 00342 board.debug("P2 S2: %d\r\n", board.getGroveDio(GROVE_CH2, GROVE_SIG2)); 00343 #endif /* defined(TEST_DIGITAL_IN) */ 00344 #if defined(TEST_ANALOG) 00345 board.debug("------------\r\n"); 00346 board.debug("P1 S1: %2.2f\r\n", board.getGroveAnalog(GROVE_CH1, GROVE_SIG1)); 00347 board.debug("P1 S2: %2.2f\r\n", board.getGroveAnalog(GROVE_CH1, GROVE_SIG2)); 00348 board.debug("P2 S1: %2.2f\r\n", board.getGroveAnalog(GROVE_CH2, GROVE_SIG1)); 00349 board.debug("P2 S2: %2.2f\r\n", board.getGroveAnalog(GROVE_CH2, GROVE_SIG2)); 00350 #endif /* defined(TEST_ANALOG) */ 00351 #if defined(TEST_TEMP_HUMID) 00352 board.debug("------------\r\n"); 00353 board.debug("Temp: %2.2f, Humid: %2.2f\r\n", board.getTemp(), board.getHumid()); 00354 #endif /* defined(TEST_ANALOG) */ 00355 #if defined(TEST_ACC) 00356 int x, y, z; 00357 board.getAcc(&x, &y, &z); 00358 board.debug("------------\r\n"); 00359 board.debug("X: %d, Y: %d, Z: %d\r\n", x, y, z); 00360 #endif /* defined(TEST_ACC) */ 00361 00362 #if defined(TEST_LORA) 00363 board.debug("hello %d", i); 00364 board.sendLoRaString("hello %d", i++); 00365 // char payload[] = {0x01, 0x02, 0x03, 0x04}; 00366 // board.sendLoRaBinary(payload, sizeof(payload)); 00367 #endif /* defined(TEST_LORA) */ 00368 } while (true); 00369 }
Generated on Sat Jul 16 2022 12:52:01 by
1.7.2
