Best sensor for falling alert
-
I am starting to ding around with my project, using the following tutorial sketch but getting an error and not finding how to fix it. Is it just a coding error?
exit status 1
'D6' was not declared in this scope```#include <Wire.h> // MPU6050 Slave Device Address const uint8_t MPU6050SlaveAddress = 0x68; // Select SDA and SCL pins for I2C communication const uint8_t scl = D6; const uint8_t sda = D7; // sensitivity scale factor respective to full scale setting provided in datasheet const uint16_t AccelScaleFactor = 16384; const uint16_t GyroScaleFactor = 131; // MPU6050 few configuration register addresses const uint8_t MPU6050_REGISTER_SMPLRT_DIV = 0x19; const uint8_t MPU6050_REGISTER_USER_CTRL = 0x6A; const uint8_t MPU6050_REGISTER_PWR_MGMT_1 = 0x6B; const uint8_t MPU6050_REGISTER_PWR_MGMT_2 = 0x6C; const uint8_t MPU6050_REGISTER_CONFIG = 0x1A; const uint8_t MPU6050_REGISTER_GYRO_CONFIG = 0x1B; const uint8_t MPU6050_REGISTER_ACCEL_CONFIG = 0x1C; const uint8_t MPU6050_REGISTER_FIFO_EN = 0x23; const uint8_t MPU6050_REGISTER_INT_ENABLE = 0x38; const uint8_t MPU6050_REGISTER_ACCEL_XOUT_H = 0x3B; const uint8_t MPU6050_REGISTER_SIGNAL_PATH_RESET = 0x68; int16_t AccelX, AccelY, AccelZ, Temperature, GyroX, GyroY, GyroZ; void setup() { Serial.begin(9600); Wire.begin(sda, scl); MPU6050_Init(); } void loop() { double Ax, Ay, Az, T, Gx, Gy, Gz; Read_RawValue(MPU6050SlaveAddress, MPU6050_REGISTER_ACCEL_XOUT_H); //divide each with their sensitivity scale factor Ax = (double)AccelX/AccelScaleFactor; Ay = (double)AccelY/AccelScaleFactor; Az = (double)AccelZ/AccelScaleFactor; T = (double)Temperature/340+36.53; //temperature formula Gx = (double)GyroX/GyroScaleFactor; Gy = (double)GyroY/GyroScaleFactor; Gz = (double)GyroZ/GyroScaleFactor; Serial.print("Ax: "); Serial.print(Ax); Serial.print(" Ay: "); Serial.print(Ay); Serial.print(" Az: "); Serial.print(Az); Serial.print(" T: "); Serial.print(T); Serial.print(" Gx: "); Serial.print(Gx); Serial.print(" Gy: "); Serial.print(Gy); Serial.print(" Gz: "); Serial.println(Gz); delay(100); } void I2C_Write(uint8_t deviceAddress, uint8_t regAddress, uint8_t data){ Wire.beginTransmission(deviceAddress); Wire.write(regAddress); Wire.write(data); Wire.endTransmission(); } // read all 14 register void Read_RawValue(uint8_t deviceAddress, uint8_t regAddress){ Wire.beginTransmission(deviceAddress); Wire.write(regAddress); Wire.endTransmission(); Wire.requestFrom(deviceAddress, (uint8_t)14); AccelX = (((int16_t)Wire.read()<<8) | Wire.read()); AccelY = (((int16_t)Wire.read()<<8) | Wire.read()); AccelZ = (((int16_t)Wire.read()<<8) | Wire.read()); Temperature = (((int16_t)Wire.read()<<8) | Wire.read()); GyroX = (((int16_t)Wire.read()<<8) | Wire.read()); GyroY = (((int16_t)Wire.read()<<8) | Wire.read()); GyroZ = (((int16_t)Wire.read()<<8) | Wire.read()); } //configure MPU6050 void MPU6050_Init(){ delay(150); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_SMPLRT_DIV, 0x07); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_PWR_MGMT_1, 0x01); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_PWR_MGMT_2, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_CONFIG, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_GYRO_CONFIG, 0x00);//set +/-250 degree/second full scale I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_ACCEL_CONFIG, 0x00);// set +/- 2g full scale I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_FIFO_EN, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_INT_ENABLE, 0x01); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_SIGNAL_PATH_RESET, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_USER_CTRL, 0x00); } -
I am starting to ding around with my project, using the following tutorial sketch but getting an error and not finding how to fix it. Is it just a coding error?
exit status 1
'D6' was not declared in this scope```#include <Wire.h> // MPU6050 Slave Device Address const uint8_t MPU6050SlaveAddress = 0x68; // Select SDA and SCL pins for I2C communication const uint8_t scl = D6; const uint8_t sda = D7; // sensitivity scale factor respective to full scale setting provided in datasheet const uint16_t AccelScaleFactor = 16384; const uint16_t GyroScaleFactor = 131; // MPU6050 few configuration register addresses const uint8_t MPU6050_REGISTER_SMPLRT_DIV = 0x19; const uint8_t MPU6050_REGISTER_USER_CTRL = 0x6A; const uint8_t MPU6050_REGISTER_PWR_MGMT_1 = 0x6B; const uint8_t MPU6050_REGISTER_PWR_MGMT_2 = 0x6C; const uint8_t MPU6050_REGISTER_CONFIG = 0x1A; const uint8_t MPU6050_REGISTER_GYRO_CONFIG = 0x1B; const uint8_t MPU6050_REGISTER_ACCEL_CONFIG = 0x1C; const uint8_t MPU6050_REGISTER_FIFO_EN = 0x23; const uint8_t MPU6050_REGISTER_INT_ENABLE = 0x38; const uint8_t MPU6050_REGISTER_ACCEL_XOUT_H = 0x3B; const uint8_t MPU6050_REGISTER_SIGNAL_PATH_RESET = 0x68; int16_t AccelX, AccelY, AccelZ, Temperature, GyroX, GyroY, GyroZ; void setup() { Serial.begin(9600); Wire.begin(sda, scl); MPU6050_Init(); } void loop() { double Ax, Ay, Az, T, Gx, Gy, Gz; Read_RawValue(MPU6050SlaveAddress, MPU6050_REGISTER_ACCEL_XOUT_H); //divide each with their sensitivity scale factor Ax = (double)AccelX/AccelScaleFactor; Ay = (double)AccelY/AccelScaleFactor; Az = (double)AccelZ/AccelScaleFactor; T = (double)Temperature/340+36.53; //temperature formula Gx = (double)GyroX/GyroScaleFactor; Gy = (double)GyroY/GyroScaleFactor; Gz = (double)GyroZ/GyroScaleFactor; Serial.print("Ax: "); Serial.print(Ax); Serial.print(" Ay: "); Serial.print(Ay); Serial.print(" Az: "); Serial.print(Az); Serial.print(" T: "); Serial.print(T); Serial.print(" Gx: "); Serial.print(Gx); Serial.print(" Gy: "); Serial.print(Gy); Serial.print(" Gz: "); Serial.println(Gz); delay(100); } void I2C_Write(uint8_t deviceAddress, uint8_t regAddress, uint8_t data){ Wire.beginTransmission(deviceAddress); Wire.write(regAddress); Wire.write(data); Wire.endTransmission(); } // read all 14 register void Read_RawValue(uint8_t deviceAddress, uint8_t regAddress){ Wire.beginTransmission(deviceAddress); Wire.write(regAddress); Wire.endTransmission(); Wire.requestFrom(deviceAddress, (uint8_t)14); AccelX = (((int16_t)Wire.read()<<8) | Wire.read()); AccelY = (((int16_t)Wire.read()<<8) | Wire.read()); AccelZ = (((int16_t)Wire.read()<<8) | Wire.read()); Temperature = (((int16_t)Wire.read()<<8) | Wire.read()); GyroX = (((int16_t)Wire.read()<<8) | Wire.read()); GyroY = (((int16_t)Wire.read()<<8) | Wire.read()); GyroZ = (((int16_t)Wire.read()<<8) | Wire.read()); } //configure MPU6050 void MPU6050_Init(){ delay(150); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_SMPLRT_DIV, 0x07); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_PWR_MGMT_1, 0x01); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_PWR_MGMT_2, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_CONFIG, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_GYRO_CONFIG, 0x00);//set +/-250 degree/second full scale I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_ACCEL_CONFIG, 0x00);// set +/- 2g full scale I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_FIFO_EN, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_INT_ENABLE, 0x01); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_SIGNAL_PATH_RESET, 0x00); I2C_Write(MPU6050SlaveAddress, MPU6050_REGISTER_USER_CTRL, 0x00); } -
Are you speaking of a comment made on the tutorial? I don't see that instruction in the sketch. I did try to change to numerical values for D1 & D2 but the error followed.
-
Are you speaking of a comment made on the tutorial? I don't see that instruction in the sketch. I did try to change to numerical values for D1 & D2 but the error followed.
-
Isn't that what this is for?
// Select SDA and SCL pins for I2C communication
const uint8_t scl = D6;
const uint8_t sda = D7; -
Isn't that what this is for?
// Select SDA and SCL pins for I2C communication
const uint8_t scl = D6;
const uint8_t sda = D7; -
I'm confused. That is from my sketch. Do I add another reference?
-
I'm confused. That is from my sketch. Do I add another reference?
-
Those are the ports I am using on my ESP8266 NodeMCU
-
Those are the ports I am using on my ESP8266 NodeMCU
@mrhutchinsonmn ok, so you're using an esp8266-based Arduino. ESP8266 does not have hardware i2c. Instead, software i2c is used. Almost any pins on the esp8266 can be used for i2c.
What board have you selected in the Arudino IDE? If I select "NodeMCU 1.0 (ESP-12E module)", D6 and D7 are defined. If I select "generic esp8266 module", D6 and D7 are not defined since the pin mappings can be different for different boards.
-
Apologies!! I kept getting errors when using that board, so used another. I am on a new worksation and it turns out python was not installed. The error ceased after I installed. The sketch works fine now.
-
Not sure if it helps. I find this drop/tilt/vibration sensor https://bit.ly/2kZrZnV. And my personal advice is that you buy your dad a emergency watch with built-in heart rate detector. It would help a lot i think
-
@nca78 said in Best sensor for falling alert:
But except if there's an interest in using the gyroscope, IMHO it's a bit of an overkill, while a LIS3DH will use 50-100 times less current for free fall detection (between 6 and 11µA), ADXL345 over 10 times less (40µA)
I agree with this also especially due to the low current consumption. I would not go as far as dismissing something as overkill when considering the intended usage though.
I don't have experience with free fall detection systems but somehow it sounds more suitable for detecting a direct gravitational falling and not a person falling which likely involves legs slowing down and the fall starting from the person already standing on the ground. But I am definitely interested in hearing how this works out as this is one of those rare projects that isn't just a "nice to have". Great idea!
-
@mrhutchinsonmn ok, so you're using an esp8266-based Arduino. ESP8266 does not have hardware i2c. Instead, software i2c is used. Almost any pins on the esp8266 can be used for i2c.
What board have you selected in the Arudino IDE? If I select "NodeMCU 1.0 (ESP-12E module)", D6 and D7 are defined. If I select "generic esp8266 module", D6 and D7 are not defined since the pin mappings can be different for different boards.