Magnet jumper. Security button

Привет. Пробовал разобраться сам, но не получается. Хочу сделать что-то на подобии сигнализации. У меня есть геркон (перемычка с магнитом), и она прицеплена на дверь. При открытии двери, срабатывает уведомление.
С этим всё просто:

… //строки кода для работы с blynk
#define magswitch 8
byte magvalue;

void setup()
{
  …
  pinMode(magswitch,INPUT);
  …
}

void loop()
{
  Blynk.run();
  magvalue = digitalRead(magswitch);
  Blynk.virtualWrite (V1, magvalue);
}

Ну и в самом приложении настроил Eventor – что если magvalue = 0, то выводить уведомление, что дверь открыта.

Проблема в том, что я хочу сделать это устройство по умнее. Я добавил кнопку на панель приложения, и хочу что бы при нажатии на кнопку (режим - ON), уведомления приходили при каждом открытии двери, а при режиме кнопки OFF, не приходили уведомления. Что-то на подобии Поставить на охрану, снять с охраны.

Пробовал делать через BLYNK_WRITE(vPIN) ,но тут оно вроде и работает, но функция работает таким образом что обновление информации, происходит, только тогда, когда изменилось значение кнопки, а мене ведь нужно, чтобы оно проверяло это значение постоянно.
Пример опроса кнопки:


BLYNK_WRITE(V2)			//опрашиваю кнопку
 {
 if(param.asInt()==1)			//если параметр == 1,… 
    {
     Blynk.virtualWrite (V1, magvalue); //…то мы записываем в V1 значение переменной magvalue
    }
    else if (param.asInt()==0) //, а если == 0,…
    {
     Blynk.virtualWrite (V1, 1); //…то мы передаем в V1, значение 1, вне зависимости значения                                                                                                               magvalue
    }
 }

Может моя логика не совсем логична, но это то что мне пришло в голову. Буду благодарен за советы.
-------------------------------ENG-------Google translate------------------------------------
Hey. Tried to understand myself, but it does not work. I want to do something in the likeness of signaling. I have a reed switch (a jumper with a magnet) and it is attached to the door. When the door is opened, a notification is triggered.
With this, everything is simple:
… // a line of code to work with blynk
… CODE
Well, in the application itself configured the Eventor - that if magvalue = 0, then output a notification that the door is open.

The problem is that I want to make this device smarter. I added a button to the application bar, and I want that when the button is clicked (the mode is ON), notifications come every time the door is opened, and when the button is OFF, no notifications are notified. Something in the likeness of Arm, disarm.

Tried to do through BLYNK_WRITE (vPIN), but here it like and works, but the function works in such a way that update of the information occurs only when the value of the button has changed, and it is necessary that it checks this value constantly.
Example of button polling:


BLYNK_WRITE(V2)			// I query the button
 {
 if(param.asInt()==1)			// if the parameter is == 1, ...
    {
     Blynk.virtualWrite (V1, magvalue); // ... then we write in V1 the value of the variable                                                                                     magvalue
    }
    else if (param.asInt()==0) //, and if == 0, ...
    {
     Blynk.virtualWrite (V1, 1); // ... then we pass to V1, a value of 1, regardless of the                                                                            value of magvalue
    }
 }

Maybe my logic is not entirely logical, but this is what came into my head. I will be grateful for the advice.

Вам нужно использовать BlynkTimer и код из loop перенести в метод, который будет вызываться в BlynkTimer с указанной вами частотой: http://help.blynk.cc/getting-started-library-auth-token-code-examples/blynk-basics/keep-your-void-loop-clean

BLYNK_WRITE - срабатывает только тогда, когда из приложения происходят изменения.

1 Like

Большое спасибо. Вы мне помогли. Если у вас есть возможность, можете просмотреть мой код. Он работает с элементами, которые расположены на картинке выше. Еще раз спасибо.:wink:

P.S. Если что, я использую связь USB, по средством подключения Arduino NANO к ПК и запуском скрипта, который расположен …\arduino-1.8.5\libraries\Blynk\scripts
Отступы // сделал здесь, для комфортного просмотра.

#define BLYNK_PRINT DebugSerial #include SoftwareSerial DebugSerial(2, 3); // RX, TX #include char auth[] = "XXXX"; //lokal token //char auth[] = "XXXX"; //blynk token BlynkTimer timer1; BlynkTimer timer2; // #define ledPin 13 #define photo A7 #define magswitch 8 int photovalue; byte magvalue; byte button; int timerNo; // void photosensor() { photovalue = analogRead(photo); photovalue = map(photovalue,0,1023,0,100); photovalue = constrain(photovalue,0,100); Blynk.virtualWrite (V0, photovalue); } // void jumpersensor() { magvalue = digitalRead(magswitch); Blynk.virtualWrite (V1, magvalue); } // BLYNK_WRITE(V2) { if(param.asInt()==1) { timer2.enable(timerNo); } else { timer2.disable(timerNo); } } // void setup() { DebugSerial.begin(9600); Serial.begin(9600); Blynk.begin(Serial, auth); timer1.setInterval(1000L, photosensor); timerNo = timer2.setInterval(1000L, jumpersensor); timer2.disable(timerNo); pinMode(magswitch,INPUT); pinMode(ledPin,OUTPUT); pinMode(photo,INPUT); } // void loop() { Blynk.run(); timer1.run(); timer2.run(); }

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

Про отступы - в reply форме есть форматирование кода если что =)

1 Like

Да, таймер отличная штука. До этого, когда у меня всё было в loop() , то светодиод передачи моргал как бешеный, а теперь раз в секунду моргнул и красота. Я читал docs blynk, но как то не заметил там предупреждения о функции loop(), теперь еще буду читать help blynk. Спасибо.