Koyo Takenoshita / Mbed 2 deprecated ina-hack-2nd

Dependencies:   ADXL345_I2C Chainable_RGB_LED EEAB-P1 MMA8652FC Sht31 TinyGPS mbed

Fork of ina-hack-test by dondoko don

Files at this revision

API Documentation at this revision

Comitter:
koyo_take
Date:
Sat Jun 24 23:42:01 2017 +0000
Parent:
0:97a57be77fbb
Child:
2:829187d4fd5e
Commit message:
add samples to handle sensors

Changed in this revision

ADXL345_I2C.lib Show annotated file Show diff for this revision Revisions of this file
EEAB-P1/Eeabp1.cpp Show annotated file Show diff for this revision Revisions of this file
EEAB-P1/Eeabp1.h Show annotated file Show diff for this revision Revisions of this file
Sht31.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADXL345_I2C.lib	Sat Jun 24 23:42:01 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/peterswanson87/code/ADXL345_I2C/#6abbc844abcb
--- a/EEAB-P1/Eeabp1.cpp	Sat Jun 24 03:45:00 2017 +0000
+++ b/EEAB-P1/Eeabp1.cpp	Sat Jun 24 23:42:01 2017 +0000
@@ -4,7 +4,11 @@
 //Thread thread;
 static const int lora_msg_max_len = 11;
 
-Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23), lora_reset(P0_22), lora_power(P0_5), grove_power(P0_6)
+Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23), 
+    lora_power(P0_5), lora_reset(P0_22), grove_power(P0_6),
+    grv_sel2a(P0_19), grv_sel2g(P0_18), grv_sel1a(P0_17), grv_sel1g(P0_16),
+    grv_p1s1a(P0_2), grv_p1s2a(P0_1),
+    grv_p2s1a(P0_4), grv_p2s2a(P0_3)
 {
     this->led_state = LED_OFF;
     this->led = 0;
@@ -16,6 +20,14 @@
     this->grove_power = 0;
     this->lora_enabled = false;
     this->grove_enabled = false;
+    // Grove端子をHiZに
+    this->grv_sel1g = 1;
+    this->grv_sel1a = 1;
+    this->grv_sel2g = 1;
+    this->grv_sel2a = 1;
+    grv_p1s1do = NULL, grv_p1s2do = NULL, grv_p1s1di = NULL, grv_p1s2di = NULL;
+    grv_p2s1do = NULL, grv_p2s2do = NULL, grv_p2s1di = NULL, grv_p2s2di = NULL;
+    temp_humid_sensor = NULL;
 }
 
 int Eeabp1::setLedState(EeabLedState state)
@@ -79,6 +91,12 @@
         serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
         wait(1);
         flushSerial();
+        serial->printf("mod factory_reset\r\n"); // ファクトリーリセットを行い鍵をリフレッシュ
+        ret = chkSerialCharOk();
+        if (ret != 0)
+            return ret;
+        serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
+        wait(1);
         serial->printf("lorawan join otaa\r\n"); // Gatewayに接続(OTAA)
         ret = chkSerialCharRes('a'); // 成功 ">> accepted" 失敗 ">> unsuccess"
         if (ret != 0)
@@ -119,7 +137,6 @@
 
     flushSerial();
     serial->puts(msg);
-    //serial->printf("lorawan tx ucnf 16 74657374\r\n");
 
     return 0;
 }
@@ -135,10 +152,239 @@
         if (!grove_enabled)
             return; /* power is already off, do nothing */
         
+        // Grove端子をHiZに
+        grv_sel1g = 1;
+        grv_sel1a = 1;
+        grv_sel2g = 1;
+        grv_sel2a = 1;
         grove_power = 0;
     }
 }
 
+int Eeabp1::setGrovePortType(EeabGrovePort port, EeabGrovePortType type)
+{
+    switch (port) {
+        case GROVE_CH1:
+            if (type == GROVE_ANALOG) {
+                grv_sel1g = 1;
+                grv_sel1a = 0;
+            } else {
+                grv_sel1g = 0;
+                grv_sel1a = 1;
+            }
+            break;
+        case GROVE_CH2:
+            if (type == GROVE_ANALOG) {
+                grv_sel2g = 1;
+                grv_sel2a = 0;
+            } else {
+                grv_sel2g = 0;
+                grv_sel2a = 1;
+            }
+            break;
+        default:
+            /* do nothing */
+            break;
+    }
+
+    return 0;
+}
+
+int Eeabp1::setGroveDioDirection(EeabGrovePort port, EeabGroveDioDirection dir, Callback<void()> f)
+{
+    switch (port) {
+        case GROVE_CH1:
+            if(dir == GROVE_DIO_OUT) {
+                if (grv_p1s1di) {
+                    delete grv_p1s1di;
+                    grv_p1s1di = NULL;
+                }
+                grv_p1s1do = new DigitalOut(P0_13);
+
+                if (grv_p1s2di) {
+                    delete grv_p1s2di;
+                    grv_p1s2di = NULL;
+                }
+                grv_p1s2do = new DigitalOut(P0_12);
+            } else { /* GROVE_DIO_IN */
+                if (grv_p1s1do) {
+                    delete grv_p1s1do;
+                    grv_p1s1do = NULL;
+                }
+                grv_p1s1di = new InterruptIn(P0_13);
+                if (f)
+                    grv_p1s1di->rise(f);
+
+                if (grv_p1s2do) {
+                    delete grv_p1s2do;
+                    grv_p1s2do = NULL;
+                }
+                grv_p1s2di = new InterruptIn(P0_12);
+                grv_p1s2di->rise(f);
+            }
+            break;
+        case GROVE_CH2:
+            if(dir == GROVE_DIO_OUT) {
+                if (grv_p2s1di) {
+                    delete grv_p2s1di;
+                    grv_p2s1di = NULL;
+                }
+                grv_p2s1do = new DigitalOut(P0_15);
+
+                if (grv_p2s2di) {
+                    delete grv_p2s2di;
+                    grv_p2s2di = NULL;
+                }
+                grv_p2s2do = new DigitalOut(P0_14);
+            } else { /* GROVE_DIO_IN */
+                if (grv_p2s1do) {
+                    delete grv_p2s1do;
+                    grv_p2s1do = NULL;
+                }
+                grv_p2s1di = new InterruptIn(P0_15);
+                if (f)
+                    grv_p2s1di->rise(f);
+
+                if (grv_p2s2do) {
+                    delete grv_p2s2do;
+                    grv_p2s2do = NULL;
+                }
+                grv_p2s2di = new InterruptIn(P0_14);
+                grv_p2s2di->rise(f);
+            }
+            break;
+        default:
+            /* do nothing */
+            break;
+    }
+
+    return 0;
+}
+
+int Eeabp1::setGroveDio(EeabGrovePort port, EeabGroveDio val)
+{
+    switch (port) {
+        case GROVE_CH1:
+            *grv_p1s1do = val;
+            *grv_p1s2do = val;
+            break;
+        case GROVE_CH2:
+            *grv_p2s1do = val;
+            *grv_p2s2do = val;
+            break;
+        default:
+            break;
+    }
+
+    return 0;
+}
+
+int Eeabp1::getGroveDio(EeabGrovePort port, EeabGroveSig sig)
+{
+    switch (port) {
+        case GROVE_CH1:
+            if (grv_p1s1di == NULL)
+                return -1;
+            return (sig == GROVE_SIG1) ?
+                grv_p1s1di->read() : grv_p1s2di->read();
+        case GROVE_CH2:
+            if (grv_p2s1di == NULL)
+                return -1;
+            return (sig == GROVE_SIG1) ?
+                grv_p2s1di->read() : grv_p2s2di->read();
+        default:
+            break;
+    }
+
+    return -1;
+}
+
+float Eeabp1::getGroveAnalog(EeabGrovePort port, EeabGroveSig sig)
+{
+    switch (port) {
+        case GROVE_CH1:
+            return (sig == GROVE_SIG1) ?
+                grv_p1s1a.read() : grv_p1s2a.read();
+        case GROVE_CH2:
+            return (sig == GROVE_SIG1) ?
+                grv_p2s1a.read() : grv_p2s2a.read();
+        default:
+            break;
+    }
+
+    return -1;
+}
+
+int Eeabp1::enableTempHumidSensor(void)
+{
+    temp_humid_sensor = new Sht31(P0_30, P0_7);    
+    return 0;
+}
+
+float Eeabp1::getTemp(void)
+{
+    if (!temp_humid_sensor)
+        return -1;
+
+    return temp_humid_sensor->readTemperature();
+}
+
+float Eeabp1::getHumid(void)
+{
+    if (!temp_humid_sensor)
+        return -1;
+
+    return temp_humid_sensor->readHumidity();
+}
+
+int Eeabp1::enableAccelerometer(void)
+{
+    accelerometer = new ADXL345_I2C(P0_30, P0_7);
+
+    this->debug("Device ID is: 0x%02x\n", accelerometer->getDeviceID());
+    wait(.001);
+    
+    // These are here to test whether any of the initialization fails. It will print the failure
+    if (accelerometer->setPowerControl(0x00)) {
+         this->debug("didn't intitialize power control\n"); 
+         return -1;
+    }
+    wait(.001);
+     
+    //Full resolution, +/-16g, 4mg/LSB.
+    if(accelerometer->setDataFormatControl(0x0B)) {
+        this->debug("didn't set data format\n");
+        return -1;
+    }
+     wait(.001);
+     
+    //3.2kHz data rate.
+    if(accelerometer->setDataRate(ADXL345_3200HZ)) {
+        this->debug("didn't set data rate\n");
+        return -1;
+    }
+    wait(.001);
+     
+    //Measurement mode.
+    if(accelerometer->setPowerControl(MeasurementMode)) {
+        this->debug("didn't set the power control to measurement\n");
+        return -1;
+    }
+    
+    return 0;
+}
+
+int Eeabp1::getAcc(int *x, int *y, int *z)
+{
+    int readings[3] = {0, 0, 0};
+    accelerometer->getOutput(readings);
+    *x = readings[0];
+    *y = readings[1];
+    *z = readings[2];
+    
+    return 0;
+}
+
 /* private functions */
 void Eeabp1::flushSerial()
 {
@@ -245,9 +491,9 @@
     if (ret != 0)
         return __LINE__;
 
-    ret = chkSerialChar(chkchr,2000);
+    ret = waitSerialChar(chkchr,4000);
     if (ret != 0)
-        return ret * __LINE__;
+        return __LINE__;
 
     ret = waitSerialChar('>',4000);
     if (ret != 0)
--- a/EEAB-P1/Eeabp1.h	Sat Jun 24 03:45:00 2017 +0000
+++ b/EEAB-P1/Eeabp1.h	Sat Jun 24 23:42:01 2017 +0000
@@ -2,14 +2,41 @@
 #define EEAPP1_H
 #include "mbed.h"
 #include "types.h"
+#include "Sht31.h"
+#include "ADXL345_I2C.h"
 
-enum EeabLedState {
+typedef enum {
     LED_OFF,
     LED_ON,
     LED_BLINK_FAST,
     LED_BLINK_MID,
     LED_BLINK_SLOW,
-};
+}EeabLedState;
+
+typedef enum {
+    GROVE_CH1,
+    GROVE_CH2,
+}EeabGrovePort;
+
+typedef enum {
+    GROVE_SIG1,
+    GROVE_SIG2,
+}EeabGroveSig;
+
+typedef enum {
+    GROVE_DIO,
+    GROVE_ANALOG,
+}EeabGrovePortType;
+
+typedef enum {
+    GROVE_DIO_OUT,
+    GROVE_DIO_IN,
+}EeabGroveDioDirection;
+
+typedef enum {
+    GROVE_DIO_LOW = 0,
+    GROVE_DIO_HIGH = 1,
+}EeabGroveDio;
 
 class Eeabp1
 {
@@ -21,6 +48,16 @@
     int setLoRaPower(bool on);
     int sendLoRaString(const char * format, ...);
     void setGrovePower(bool on);
+    int setGrovePortType(EeabGrovePort port, EeabGrovePortType type);
+    int setGroveDioDirection(EeabGrovePort port, EeabGroveDioDirection dir, Callback<void()> func = NULL);
+    int setGroveDio(EeabGrovePort port, EeabGroveDio val);
+    int getGroveDio(EeabGrovePort port, EeabGroveSig sig);
+    float getGroveAnalog(EeabGrovePort port, EeabGroveSig sig);
+    int enableTempHumidSensor(void);
+    float getTemp(void);
+    float getHumid(void);
+    int enableAccelerometer(void);
+    int getAcc(int *x, int *y, int *z);
 
 private:
     DigitalOut pwr_en;
@@ -35,6 +72,27 @@
     /* Grove */
     DigitalOut grove_power;
     bool grove_enabled;
+    DigitalOut grv_sel2a;
+    DigitalOut grv_sel2g;
+    DigitalOut grv_sel1a;
+    DigitalOut grv_sel1g;
+    
+    DigitalOut *grv_p1s1do; //Port1, Signal1, Digital Out // GP2
+    DigitalOut *grv_p1s2do; //Port1, Signal2, Digital Out // GP1
+    InterruptIn *grv_p1s1di; //Port1, Signal1, Digital In // GP2
+    InterruptIn *grv_p1s2di; //Port1, Signal1, Digital In // GP2
+    AnalogIn grv_p1s1a; //Port1, Signal1, Analog In // AN2
+    AnalogIn grv_p1s2a; //Port1, Signal2, Analog In // AN2
+
+    DigitalOut *grv_p2s1do; //Port2, Signal1, Digital Out // GP4
+    DigitalOut *grv_p2s2do; //Port2, Signal2, Digital Out // GP3
+    InterruptIn *grv_p2s1di; //Port2, Signal1, Digital In // GP4
+    InterruptIn *grv_p2s2di; //Port2, Signal2, Digital In // GP3
+    AnalogIn grv_p2s1a; //Port2, Signal1, Analog In // AN4
+    AnalogIn grv_p2s2a; //Port2, Signal2, Analog In // AN3
+
+    Sht31 *temp_humid_sensor;
+    ADXL345_I2C *accelerometer;
 
     void flushSerial();
     int chkSerialChar(const char,uint16_t);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Sht31.lib	Sat Jun 24 23:42:01 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/GeofferyOmlette/code/Sht31/#756e26f0b067
--- a/main.cpp	Sat Jun 24 03:45:00 2017 +0000
+++ b/main.cpp	Sat Jun 24 23:42:01 2017 +0000
@@ -2,25 +2,121 @@
 #include "TinyGPS.h"
 #include "Eeabp1.h"
 
+//#define TEST_ANALOG
+#define TEST_TEMP_HUMID
+#define TEST_ACC
+
+#if defined(TEST_DIGITAL_IN_INTTERUPT)
+Eeabp1 *gp;
+bool led_on = true;
+
+void flip() {
+    if (led_on)
+        gp->setLedState(LED_OFF);
+    else
+        gp->setLedState(LED_ON);
+    led_on = !led_on;
+}
+#endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */
+
 int main(void)
 {
     Eeabp1 board;
     int ret = 0;
 
-    board.setLedState(LED_BLINK_FAST);
+#if defined(TEST_DIGITAL_IN_INTTERUPT)
+    gp = &board;
+    led_on = true;
+#endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */
+
+    board.setLedState(LED_ON);
     board.debug("Hello ina-hack!\r\n");
 
     board.setGrovePower(true);
+#if defined(TEST_DIGITAL_OUT) || defined(TEST_DIGITAL_IN) || defined(TEST_DIGITAL_IN_INTTERUPT)
+    board.setGrovePortType(GROVE_CH1, GROVE_DIO);
+    board.setGrovePortType(GROVE_CH2, GROVE_DIO);
+#endif
+#if defined(TEST_DIGITAL_OUT)
+    board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_OUT);
+    board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_OUT);
+#endif /* defined(TEST_DIGITAL_OUT) */
+#if defined(TEST_DIGITAL_IN)
+    board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_IN);
+    board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_IN);
+#endif /* defined(TEST_DIGITAL_IN) */
+#if defined(TEST_DIGITAL_IN_INTTERUPT)
+    board.setGroveDioDirection(GROVE_CH1, GROVE_DIO_IN, flip);
+    board.setGroveDioDirection(GROVE_CH2, GROVE_DIO_IN, flip);
+#endif /* defined(TEST_DIGITAL_IN_INTTERUPT) */
+#if defined(TEST_ANALOG)
+    board.setGrovePortType(GROVE_CH1, GROVE_ANALOG);
+    board.setGrovePortType(GROVE_CH2, GROVE_ANALOG);
+#endif /* defined(TEST_ANALOG) */
+
+#if defined(TEST_LORA)
     ret = board.setLoRaPower(true);
     if (ret != 0) {
-//        board.setLedState(LED_OFF);
         board.debug("error %d\r\n", ret);
     }
+#endif /* defined(TEST_LORA) */
+#if defined(TEST_TEMP_HUMID)
+    ret = board.enableTempHumidSensor();
+    if (ret != 0)
+        board.debug("error %d\r\n", ret);
+#endif /* TEST_TEMP_HUMID */
+#if defined(TEST_ACC)
+    ret = board.enableAccelerometer();
+    if (ret != 0)
+        board.debug("error %d\r\n", ret);
+#endif /* defined(TEST_ACC) */
 
+#if defined(TEST_LORA)
     int i = 0;
+#endif /* defined(TEST_LORA) */
+#if defined(TEST_DIGITAL_OUT)
+    bool on = true;
+#endif /* defined(TEST_DIGITAL_OUT) */
     do {
-        wait(10);
+        wait(2);
         board.loop();
+#if defined(TEST_DIGITAL_OUT)
+        if (on) {
+            board.setGroveDio(GROVE_CH1, GROVE_DIO_HIGH);
+            board.setGroveDio(GROVE_CH2, GROVE_DIO_LOW);
+        } else {
+            board.setGroveDio(GROVE_CH1, GROVE_DIO_LOW);
+            board.setGroveDio(GROVE_CH2, GROVE_DIO_HIGH);
+        }
+        on = !on;
+#endif /* defined(TEST_DIGITAL_OUT) */
+#if defined(TEST_DIGITAL_IN)
+        board.debug("------------\r\n");
+        board.debug("P1 S1: %d\r\n", board.getGroveDio(GROVE_CH1, GROVE_SIG1));
+        board.debug("P1 S2: %d\r\n", board.getGroveDio(GROVE_CH1, GROVE_SIG2));
+        board.debug("P2 S1: %d\r\n", board.getGroveDio(GROVE_CH2, GROVE_SIG1));
+        board.debug("P2 S2: %d\r\n", board.getGroveDio(GROVE_CH2, GROVE_SIG2));
+#endif /* defined(TEST_DIGITAL_IN) */
+#if defined(TEST_ANALOG)
+        board.debug("------------\r\n");
+        board.debug("P1 S1: %2.2f\r\n", board.getGroveAnalog(GROVE_CH1, GROVE_SIG1));
+        board.debug("P1 S2: %2.2f\r\n", board.getGroveAnalog(GROVE_CH1, GROVE_SIG2));
+        board.debug("P2 S1: %2.2f\r\n", board.getGroveAnalog(GROVE_CH2, GROVE_SIG1));
+        board.debug("P2 S2: %2.2f\r\n", board.getGroveAnalog(GROVE_CH2, GROVE_SIG2));
+#endif /* defined(TEST_ANALOG) */
+#if defined(TEST_TEMP_HUMID)
+        board.debug("------------\r\n");
+        board.debug("Temp: %2.2f, Humid: %2.2f\r\n", board.getTemp(), board.getHumid());
+#endif /* defined(TEST_ANALOG) */
+#if defined(TEST_ACC)
+        int x, y, z;
+        board.getAcc(&x, &y, &z);
+        board.debug("------------\r\n");
+        board.debug("X: %d, Y: %d, Z: %d\r\n", x, y, z);
+#endif /* defined(TEST_ACC) */
+
+#if defined(TEST_LORA)
         board.sendLoRaString("hello %d", i++);
+#endif /* defined(TEST_LORA) */
     } while(true);
 }
\ No newline at end of file