Ina hackathon 2nd

Dependencies:   ADXL345_I2C Chainable_RGB_LED EEAB-P1 MMA8652FC Sht31 TinyGPS mbed

Fork of ina-hack-test by dondoko don

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }