Плавающий магнитный переключатель прерывает atmega328p и RN2483 отправляет данные

Это было так просто в моем представлении, но на самом деле это не так. У меня есть поплавковый выключатель, который поднимается, когда вода плавает. Поэтому я подключаю выключатель к выводу INT0 микроконтроллера. Поэтому, когда вода не плавает, все в порядке. Когда вода плавает, я отправляю данные. Я объявляю прерывание следующим образом:

attachInterrupt (digitalPinToInterrupt (switch), float, RISING);

Где находится поплавок

void float()
{
detachInterrupt(0);
digitalWrite (LED, HIGH);    
txReturn = myRN.txCnf("1");
}  

И мой основной цикл

attachInterrupt (digitalPinToInterrupt (BUTTON), switchPressed, RISING);
digitalWrite (LED, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

Я не могу понять, почему мой светодиод не переходит в состояние LOW и почему мое прерывание бесполезно после первого успешного раза. Я знаю, что должен делать процедуры прерываний короткими и txReturn.txCnf("1"); я не знаю, но я не могу понять, где моя логика неверна.

, 👍0

Обсуждение

txCnf сам может зависеть от прерываний. Поэтому ваш код зависнет. Установите логический флаг в процедуре прерывания. В цикле, если флаг установлен, отправьте данные и очистите прерывание., @Gerben

поплавковый выключатель, который поднимается .... что вы имеете в виду под поднимается? .... выключатели обычно открываются или закрываются, @jsotola


1 ответ


Лучший ответ:

2

float уже определен для числа с плавающей точкой, поэтому вы не можете использовать его для своей функции, которая определяет, когда датчик плавает на воде. Попробуйте назвать его как-то иначе.

Кроме того, вместо отсоединения и повторного присоединения прерывания используйте конечный автомат. Когда прерывание срабатывает, вы сможете запустить другой код в основном цикле.

unsigned int state;
void setup(){
  state=1;
  attachInterrupt(0,changestate,RISING);
}
void loop(){

switch (state) {
case 1: // сделать что-то
// добавьте код здесь
break;

case 2: // сделать что-то еще
// добавьте код здесь
break;
}
}

void changestate(){
if(state==1){state=2;} // прерывание изменяет состояние
}
,

Хорошо, ваш подход кажется более разумным и эффективным. Я попробую., @alexisicte