I have a XIAO nRF52840 (Sense) and have the IMU working to detect tilt. I have it set/reset two persistent relays I have for a project. I hear them toggle, and see the LED change colors for the two tilt states.
But then I was trying to use one more pin for an input interrupt. I have been able to get the interrupt to fire but can’t seem to get it working reliably or with any accuracy/clarity what it’s doing. Here is my script:
#include "LSM6DS3.h"
#include "Wire.h"
//Create a instance of class LSM6DS3
LSM6DS3 myIMU(I2C_MODE, 0x6A); //I2C device address 0x6A
const int relayASetPin = 0;
const int relayAResetPin = 1;
const int relayBSetPin = 2;
const int relayBResetPin = 3;
const int signalPin = 4;
volatile byte state = LOW;
float zAccel = 0;
float hysterisis = 0;
bool lastZStateUp = true;
void setup() {
//Serial.begin(115200);
//while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
myIMU.begin();
pinMode(relayASetPin, OUTPUT);
pinMode(relayAResetPin, OUTPUT);
pinMode(relayBSetPin, OUTPUT);
pinMode(relayBResetPin, OUTPUT);
pinMode(signalPin, INPUT);
digitalWrite(relayASetPin, LOW);
digitalWrite(relayAResetPin, LOW);
digitalWrite(relayBSetPin, LOW);
digitalWrite(relayBResetPin, LOW);
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
zAccel = myIMU.readFloatAccelZ();
// give accel time to settle
delay (100);
pinMode(signalPin, INPUT);
attachInterrupt(signalPin, blink, FALLING);
//attachInterrupt(digitalPinToInterrupt(signalPin), blink, CHANGE);
}
void loop() {
zAccel = myIMU.readFloatAccelZ();
//Serial.print(" Z1 = ");
//Serial.println(myIMU.readFloatAccelZ(), 4);
if (zAccel > 0.60 + hysterisis) {
if (lastZStateUp != true) {
//Serial.println("new up state");
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(relayASetPin, HIGH);
delay(20);
digitalWrite(relayASetPin, LOW);
delay(500);
digitalWrite(relayBSetPin, HIGH);
delay(20);
digitalWrite(relayBSetPin, LOW);
lastZStateUp = true;
hysterisis = 0.0;
}
} else {
if (lastZStateUp == true) {
//Serial.println("new down state");
digitalWrite(LEDB, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(relayAResetPin, HIGH);
delay(20);
digitalWrite(relayAResetPin, LOW);
delay(500);
digitalWrite(relayBResetPin, HIGH);
delay(20);
digitalWrite(relayBResetPin, LOW);
lastZStateUp = false;
hysterisis = 0.2;
}
}
delay(500);
}
void blink () {
//Serial.println(" got int");
state = !state;
if (state == LOW ) {
digitalWrite(LEDR, LOW);
delay(500);
} else {
digitalWrite(LEDR, HIGH);
delay(500);
}
}
I’ve tried printing from the interrupt, and setting the led. When I touch pin 4 to ground, the board locks up (tilts don’t trigger the relays anymore).
I’ve tried
pinMode(signalPin, INPUT);
and
pinMode(signalPin, INPUT_PULLUP);
And I’ve tried
attachInterrupt(signalPin, blink, FALLING);
attachInterrupt(digitalPinToInterrupt(signalPin), blink, CHANGE);
attachInterrupt(digitalPinToInterrupt(signalPin), blink, LOW);