«Arduino и Telegram» – Урок 4: PIR датчик и время из интернета

Четвёртый урок из цикла «Arduino и Telegram».  В нём мы разберемся с PIR датчиком движения, научимся записывать время последнего визита домой и получать его с помощью бота.
[vc_row][vc_column][vc_wp_text][intense_spacer type=»block» height=»30″]

Четвёртый урок из цикла «Arduino и Telegram».  В нём мы разберемся с PIR датчиком движения, научимся записывать время последнего визита домой и получать его с помощью бота.[/vc_wp_text][intense_alert border_radius=»10px» close=»1″ close_memory=»2″ shadow=»0″ margin_bottom=»» tab_984862461=»» tab_411412670=»» tab_1479978263=»» tab_1595777515=»» tab_1376433241=»» tab_928372326=»» tab_739519200=»» tab_1498199276=»»]Для прохождения данного урока необходимо настроить ArduinoIDE и подключить телеграм бота, как показано в  первом уроке.[/intense_alert][/vc_column][/vc_row][vc_row id=»» color=»warning» font_color=»» hover_color=»» border_radius=»10px» box_shadow=»» block=»» close=»1″ close_memory=»2″ shadow=»0″ class=»» margin_top=»» margin_bottom=»» margin_left=»» margin_right=»» padding_top=»» padding_bottom=»» padding_left=»» padding_right=»» tab_984862461=»» tab_411412670=»» tab_1479978263=»» tab_1595777515=»» tab_1376433241=»» tab_928372326=»»][vc_column][intense_alert color=»warning» border_radius=»10px» close=»1″ close_memory=»2″ shadow=»0″ margin_bottom=»» tab_984862461=»» tab_411412670=»» tab_1479978263=»» tab_1595777515=»» tab_1376433241=»» tab_928372326=»» tab_1529799808=»» tab_863225959=»»]Не забывайте о технике безопасности при работе с электрическими устройствами![/intense_alert][/vc_column][/vc_row][vc_row][vc_column][vc_tta_tour][vc_tta_section title=»1. Компоненты» tab_id=»1530212066272-7ade2689-a7a2″][vc_wp_text]

Нам понадобятся NodeMCU, PIR датчик движения, светодиоды, соединительные провода, breadboard.

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»2. Схема подключения» tab_id=»1530212066311-47b7cd96-2ed2″][vc_wp_text]Давайте подключим датчик движения. Перед подключением его необходимо настроить. Ставим перемычку на букву L, и тогда он будет слать одиночные импульсы. Первый потенциометр ставьте на минимум, чтобы импульсы были короткие (нам важно засечь движение). А второй потенциометр — это дальность срабатыватывания. Советую сразу ставить на максимум.
Теперь подключите все по схеме на картинке. Светодиод необязательный, но подключив его, удобно видеть срабатывание датчика.

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»3. Алгоритм программы» tab_id=»1530473771053-ad34e256-f134″][vc_wp_text]

При запуске устройства мы подключаемся к wifi и записываем время включения.

Во время работы устройство каждые 10 секунд обновляет данные о нахождении человека в помещении. При получении команды last в чате — отправляется время последнего визита. Команда timeon отправляет время последнего включения.

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

Скетч целиком можно скачать на github.

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»4. Объяснение кода» tab_id=»1531387182533-6e5e555b-ba3f»][vc_wp_text]Подключение библиотек:

#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WifiUDP.h>
#include <WiFiClientSecure.h>
#include <String.h>
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>
#include <TelegramBot.h>

Обьявляем пины и пару переменных для обращения к серверу за временем:

#define pirPin 15 //D8
#define work 10 //SD3
#define NTP_OFFSET   60 * 60      // В секундах
#define NTP_INTERVAL 60 * 1000    // В миллисекундах
#define NTP_ADDRESS  "ca.pool.ntp.org"  // можно заменить на любой ближайший пул (см. ntp.org)

Указываем wifi сеть и кучу переменных для работы программы:

const char* ssid = "xxx";
const char* password = "yyy";
const char BotToken[] = "zzz";
unsigned long lastMillis;
String date;
String t;
String lastTime;
String lastDate;
String newMsg;
String timeOn;
const char * months[] = {"Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"} ;

Запускаем бота и клиента

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
WiFiClientSecure net_ssl;
TelegramBot bot (BotToken, net_ssl);

Подключаемся к wifi, записываем время запуска, включаем индикатор работы:

void setup (){
  pinMode(work, OUTPUT);
  digitalWrite(work, LOW);
  
  Serial.begin(9600); 
  
  wifiConnect();
  
  timeClient.begin();   //Запускаем NTP UDP клиент
  delay(1000);
  bot.begin(); 

  getTime();
  timeOn = date+" "+t;
  
  pinMode(pirPin, INPUT);
  Serial.println("Good");
  digitalWrite(work, HIGH);
}

В основном цикле используем функции для обновления датчика и общения с пользователем:

void loop(){
  
  pirCheck();
  chat();
  
}

Функция для получения времени

void getTime(){
  date = "";t = "";
  timeClient.update();
  unsigned long epochTime =  timeClient.getEpochTime();
  time_t local, utc;
  utc = epochTime;
  TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, +120};  //UTC - 5 hours - change this as needed
  TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, +60};   //UTC - 6 hours - change this as needed
  Timezone usEastern(usEDT, usEST);
  local = usEastern.toLocal(utc);
  date += months[month(local)-1];
  date += " ";
  date += day(local);
  t += hour(local);
  t += ":";
  if(minute(local) < 10)  // приписываем ноль, если число меньше 10
    t += "0";
  t += minute(local);
  t += " ";
  Serial.println(date);
  Serial.println(t);
}

Функция для подключения к wifi

void wifiConnect(){
  Serial.print("Connecting");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi at ");
  Serial.print(WiFi.localIP());
  Serial.println("");
}

Функция обновления датчика

void pirCheck(){
    if (digitalRead(pirPin) == HIGH && millis() - lastMillis > 10000){
    lastMillis = millis();
    getTime();
    lastDate = date;
    lastTime = t;
    Serial.println(date);
    Serial.println(t);
    newMsg = "" + date + " "+t;
  }
}

Функция для общения с пользователем

void chat(){
  message m = bot.getUpdates();
  if (m.text.equals("last")){   
    bot.sendMessage(m.chat_id, newMsg);  
  } else if (m.text.equals("timeon")){   
    bot.sendMessage(m.chat_id, timeOn);  
  }
}
[/vc_wp_text][/vc_tta_section][vc_tta_section title=»5. Демонстрация работы» tab_id=»1531387539714-c131e625-bc50″][vc_gallery interval=»5″ images=»3222,3221″ img_size=»large»][/vc_tta_section][/vc_tta_tour][/vc_column][/vc_row][vc_row][vc_column][vc_wp_text]Благодарю за прочтение![/vc_wp_text][/vc_column][/vc_row]

Загрузка ...
The Robot
Adblock
detector