Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADXL345_I2C Chainable_RGB_LED EEAB-P1 MMA8652FC Sht31 TinyGPS mbed
Fork of ina-hack-test by
Revision 1:195da8230785, committed 2017-06-24
- 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
--- /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
