• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Не могу написать скетч для подключения к Blynk датчика движения HC-SR501

Ildarmustafin86

Active member
Вы не говорили про кнопки и System. Какой вопрос по ним? Из ваших сообщений я понимаю, что что-то работает не так как вы хотите.
 

russiano

New member
Да, проблема в том, что цикл датчика движения распознает только то, что в коде заранее написано, должен ли быть датчик включенным или нет, и не меняется в зависимости от положения переключателя в блинке. Переменные у меня вроде заданы вне циклов, то есть должны видны везде.
 

russiano

New member
В отдельном коде для датчика движения можно увидеть, что int pinValue = 0; видна везде, а в void setup() задается дополнительная pinValue = param.asInt();. которая и позволяет работать или не работать датчику от кнопки, а не по заранее прописанному сценарию
 

russiano

New member
Когда же я пытаюсь написать то же самое в объединенном коде, возникает конфликт
 

russiano

New member
Проще говоря теперь цикл не работает должным образом от изменений переключателя в блинке. pinValue остается таким, который задан заранее
Код:
void notifiaction()
{
bool sensor = digitalRead(D2); // PIR SENSOR OUTPUT PIN D2
Serial.println(sensor);
if (pinValue == 1)
{
Serial.println("System is ON");
if (sensor == 1)
{
Blynk.notify("WARNING! Please check your security system");
digitalWrite(D5, HIGH); // LED ON
}
else if (sensor == 0)
{
digitalWrite(D5, LOW); // LED  OFF
}
}
else if (pinValue == 0)
{
Serial.println("System is OFF");
digitalWrite(D5, LOW);  // LED OFF
}
{
  Blynk.virtualWrite(V6,sensor);
}
}
 

Ildarmustafin86

Active member
Переменные задают перед функциями, а не между ними. Для чего вы задаёте дополнительный pinValue, если он уже задан.
 

Ildarmustafin86

Active member
pinValue должен быть объявлен только как глобальная переменная. Не объявляйте ее локально внутри функций
 

russiano

New member
То есть ее нужно объявить единожды за весь код? Если ее так объявлять, то появляется ошибка
Код:
// Настройки Wi-Fi
char ssid[] = "Sila_Sibiri";// Имя сети
char pass[] = "russiano2453";//Пароль сети. Нет пароля - ""

//Создаем объект timer класса BlynkTimer
BlynkTimer timer;
int pinValue = param.asInt;
// Функция реагирует на событие (изменение) на виртуальном пине
//Изменения происходит в веб-интерфейсе (на сервере) или в мобильном приложении
BLYNK_WRITE(V0)

{
 

Вложения

russiano

New member
Я попереставлял функции, и получилось так. В принципе это работает как мне надо, но не знаю, насколько это грамотная запись. Я сначала отправляю значение кнопки в блинк, а потом из блинка обратно в код.
Код:
/*************************************************************
Передача температуры и влажности в сервис Blynk.io
 *************************************************************/

// Основные параметры. Выданы сервисом Blynk.Cloud
// Код всегда должен начинаться с этих строк
#define BLYNK_TEMPLATE_ID "TMPLef2oMkx2" //Уникальный идентификатор шаблона
#define BLYNK_DEVICE_NAME "Quickstart Device" //Название устройства IoT
#define BLYNK_AUTH_TOKEN  "sdrp3X9EbhmViNsqfdZnkGoizQAG328x" //Уникальный токен

//Разрешение вывода в монитор порта для отладки.
//В этом скетче не используется. Понадобится при использовании Blynk.Edgent
#define BLYNK_PRINT Serial

//Подключение библиотек
#include <ESP8266WiFi.h>//Библиотека для работы модуля Wi-Fi
#include <BlynkSimpleEsp8266.h>//Библиотека для ESP8266 с сервисом Blynk
#include "DHT.h"
#define DHTTYPE DHT22 //Используем датчик DHT22
#define DHTPIN D8 // Датчик DHT22 подключаем к порту D8
//Создаем объект dht с параметрами пина подключения и типа датчика
//Объект dht(DHTPIN,DHTTYPE) класса DHT
DHT dht(DHTPIN, DHTTYPE);
char auth[] = BLYNK_AUTH_TOKEN;//Переменная для токена платы

// Настройки Wi-Fi
char ssid[] = "Sila_Sibiri";// Имя сети
char pass[] = "russiano2453";//Пароль сети. Нет пароля - ""

//Создаем объект timer класса BlynkTimer
BlynkTimer timer;

// Функция реагирует на событие (изменение) на виртуальном пине
//Изменения происходит в веб-интерфейсе (на сервере) или в мобильном приложении
BLYNK_WRITE(V0)
{
  // К V0 подключен переключатель. Состояние переключателя (1 или 0) считывается
  int value = param.asInt();//в переменную value

  //Обновление состояния виджета на указанном пине
  Blynk.virtualWrite(V1, value);//Метка на пине V1 отражает состояние Переключателя
}

// Эта функция вызывается каждый раз, когда плата подключается к облаку Blynk.Cloud
BLYNK_CONNECTED()
{
  //На пин V3 подключена WebPage Image Button в мобильном приложении
  Blynk.setProperty(V3, "offImageUrl", "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations.png");
  Blynk.setProperty(V3, "onImageUrl",  "https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations_pressed.png");
  Blynk.setProperty(V3, "url", "https://docs.blynk.io/en/getting-started/what-do-i-need-to-blynk/how-quickstart-device-was-made");
}
//Функция отправляет прошедшее время в пин V2
void myTimerEvent()
{
  // Функция отправляет время на пин V2
  //Нельзя отправлять более 10 значений в секунду
  Blynk.virtualWrite(V2, millis() / 1000);
}

//Функция отправляет температуру, измеряемую датчиком в пин V4
void myTemperatureEvent()
{
  //Нельзя отправлять более 10 значений в секунду.
  //Переменная для температуры в градусах Цельсия
  float t = dht.readTemperature();
  Blynk.virtualWrite(V4, t);
}
// Функция отправляет влажность, измеряемую датчиком, на пин V5
void myHumidityEvent()
{
  float h = dht.readHumidity();
  Blynk.virtualWrite(V5, h);
}
int value =V1;
void notifiaction()
{
bool sensor = digitalRead(D2); // PIR SENSOR OUTPUT PIN D2
Serial.println(sensor);
if (value == 1)
{
Serial.println("System is ON");
if (sensor == 1)
{
Blynk.notify("WARNING! Please check your security system");
digitalWrite(D5, HIGH); // LED ON
}
else if (sensor == 0)
{
digitalWrite(D5, LOW); // LED  OFF
}
}
else if (value == 0)
{
Serial.println("System is OFF");
digitalWrite(D5, LOW);  // LED OFF
}
{
  Blynk.virtualWrite(V6,sensor);
}
}
void setup()
{
  //Старт передачи данных в монитор порта.
  //Используется при отладке кода
  Serial.begin(115200);
 
pinMode(D5, OUTPUT); // LED
pinMode(D2, INPUT);  // PIR SENSOR OUTPUT PIN D2

  //Авторизация на сервере Blynk.Cloud с указанными параметрами
  Blynk.begin(auth, ssid, pass);

  dht.begin();//Инициализация работы датчика
 
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);

  //Настройка таймера timer. Интервал вызова таймера - 1000 мс.
  //Вызываемая функция - myTimerEvent
  timer.setInterval(1000L, myTimerEvent);
  //Вызов функции отправки температуры
  timer.setInterval(2000L, myTemperatureEvent);
  //Вызов функции отправки показателя влажности
  timer.setInterval(2000L, myHumidityEvent);
  timer.setInterval(1000L, notifiaction);
}

void loop()
{
  Blynk.run();//Запуск сервиса Blynk на плате (запуск функций библиотеки)
  timer.run();//Запуск таймера timer класса BlynkTimer
  //Любой пользовательский код. Не использовать функцию delay()!
}
 

Ildarmustafin86

Active member
Вам нужно почитать как объявляются переменные. Методом тыка не всегда прокатывает
 

Moseich

Member
Я попереставлял функции, и получилось так. В принципе это работает как мне надо, но не знаю, насколько это грамотная запись. Я сначала отправляю значение кнопки в блинк, а потом из блинка обратно в код.
Поскольку в новом блинке приоритет у консоли, то данные из приложения сначала отправляются в консоль, а из нее на устройство. Так что все у Вас правильно. Я сейчас осваиваю новый блинк, сделал регулятор температуры и скетч примерно такой же. Только для уведомлений код вовсе не нужен - он настраиивается в меню "автоматизация".
 
Сверху Снизу