ADXL345 Проблемы с прерываниями - PullRequest
0 голосов
/ 20 сентября 2018

Я использую Wemos D1 Mini вместе с ADXL345.Я использую библиотеку Sparkfun для Arduino и могу читать (через I2C) ускорения во всех направлениях и использовать подпрограммы прерывания.Тем не менее, я не могу получить контакт прерывания (INT1) на ADXL345 для работы.Он выводит только «1» ...

То, чего я пытаюсь добиться, - это заставить прерывание (INT1) выдавать «1» при обнаружении активности и «0» в остальное время.

Я сделал простой код (на основе примеров из Sparkfun):

#include <SparkFun_ADXL345.h>         // SparkFun ADXL345 Library
#include <Wire.h>


const int inputPin = D5;     // Use D5 on Wemos D1 Mini as input pin
int inputPinState = 0;


/*********** COMMUNICATION SELECTION ***********/
/*    Comment Out The One You Are Not Using    */
//ADXL345 adxl = ADXL345(10);           // USE FOR SPI COMMUNICATION, ADXL345(CS_PIN);
ADXL345 adxl = ADXL345();             // USE FOR I2C COMMUNICATION

/****************** INTERRUPT ******************/
/*      Uncomment If Attaching Interrupt       */

void setup(){

  Serial.begin(9600);                 // Start the serial terminal
  Serial.println("ADXL345 Interrupt Test");
  Serial.println();

  // initialize input pin:
  pinMode(inputPin, INPUT);

  setupADXL();

}


/****************** MAIN CODE ******************/
/*     Accelerometer Readings and Interrupt    */
void loop(){

  inputPinState = digitalRead(inputPin); 
  Serial.println(inputPinState);
  ADXL_ISR();

}  

/******************** SETUP ********************/
/*          Configure ADXL345 Settings         */

void setupADXL(){
  adxl.powerOn();                     // Power on the ADXL345

  adxl.setRangeSetting(2);           // Give the range settings
                                      // Accepted values are 2g, 4g, 8g or 16g
                                      // Higher Values = Wider Measurement Range
                                      // Lower Values = Greater Sensitivity

  adxl.setSpiBit(0);                  // Configure the device to be in 4 wire SPI mode when set to '0' or 3 wire SPI mode when set to 1
                                      // Default: Set to 1
                                      // SPI pins on the ATMega328: 11, 12 and 13 as reference in SPI Library 

  adxl.setActivityXYZ(1, 0, 0);       // Set to activate movement detection in the axes "adxl.setActivityXYZ(X, Y, Z);" (1 == ON, 0 == OFF)
  adxl.setActivityThreshold(15);      // 62.5mg per increment   // Set activity   // Inactivity thresholds (0-255)

  adxl.setInactivityXYZ(1, 0, 0);     // Set to detect inactivity in all the axes "adxl.setInactivityXYZ(X, Y, Z);" (1 == ON, 0 == OFF)
  adxl.setInactivityThreshold(15);    // 62.5mg per increment   // Set inactivity // Inactivity thresholds (0-255)
  adxl.setTimeInactivity(5);         // How many seconds of no activity is inactive?

  /* Not needed in this project 
  //adxl.setTapDetectionOnXYZ(0, 0, 0); // Detect taps in the directions turned ON "adxl.setTapDetectionOnX(X, Y, Z);" (1 == ON, 0 == OFF)

  /* Not needed in this project 
  // Set values for what is considered a TAP and what is a DOUBLE TAP (0-255)
  adxl.setTapThreshold(50);           // 62.5 mg per increment
  adxl.setTapDuration(15);            // 625 μs per increment
  adxl.setDoubleTapLatency(80);       // 1.25 ms per increment
  adxl.setDoubleTapWindow(200);       // 1.25 ms per increment
  */

  /* Not needed in this projec 
  // Set values for what is considered FREE FALL (0-255)
  adxl.setFreeFallThreshold(7);       // (5 - 9) recommended - 62.5mg per increment
  adxl.setFreeFallDuration(30);       // (20 - 70) recommended - 5ms per increment
  */


  // Setting "activity" to take place on INT1 pin
  adxl.setImportantInterruptMapping(2, 2, 2, 1, 2);     // Sets "adxl.setEveryInterruptMapping(single tap, double tap, free fall, activity, inactivity);" 
                                                        // Accepts only 1 or 2 values for pins INT1 and INT2. This chooses the pin on the ADXL345 to use for Interrupts.
                                                        // This library may have a problem using INT2 pin. Default to INT1 pin.

  // Turn on Interrupts for each mode (1 == ON, 0 == OFF)
  adxl.InactivityINT(0);
  adxl.ActivityINT(1);
  adxl.FreeFallINT(0);
  adxl.doubleTapINT(0);
  adxl.singleTapINT(0);

//attachInterrupt(digitalPinToInterrupt(interruptPin), ADXL_ISR, RISING);   // Attach Interrupt
}


void ADXL_ISR() {


  byte interrupts = adxl.getInterruptSource();

  // Activity
  if(adxl.triggered(interrupts, ADXL345_ACTIVITY)){
    Serial.println("*** ACTIVITY ***"); 
     //add code here to do when activity is sensed
   }
...