Earth Analyzer: Продвинутый набор IoT-сенсоров для экологического мониторинга
Компоненты и материалы
- Bolt IoT WiFi Module — 1 шт.
- Arduino UNO — 1 шт.
- Arduino Nano R3 — 1 шт.
- nRF24L01 — 2 шт.
- DC Motor 12V — 2 шт.
- DFRobot Solar Power Manager для 12V свинцово-кислотного аккумулятора — 1 шт.
- SparkFun Dual H-Bridge Motor Driver L298 — 1 шт.
- Перемычки — 1 набор
- LM35 (датчик температуры) — 1 шт.
- DFRobot Gravity: Analog Capacitive Soil Moisture Sensor — 1 шт.
- SG90 Micro-servo — 1 шт.
- Joystick 10 кОм — 1 шт.
Необходимые инструменты
- Паяльник
- Проволока для пайки (без свинца)
- Флюс для пайки
- Мультитул / Отвертка
Приложения и онлайн-сервисы
- Arduino IDE
- Bolt IoT Bolt Cloud
- Integromat (Make)
- Twilio SMS Messaging API
- Mailgun
- Bolt IoT Android App
- Bolt IoT iOS App
О проекте
Этот проект представляет собой ровер для мониторинга состояния почвы и окружающей среды, предназначенный для помощи фермерам. Система состоит из трёх основных модулей.
Модуль 1: Базовая платформа и сенсоры
Подключение двух DC-моторов через драйвер L298. Выходы драйвера соединяются с цифровыми пинами Bolt (0–3). Датчик влажности почвы подключается к цифровому пину 4, датчик температуры LM35 — к аналоговому входу A0. Все цепи питания и земли объединяются и запитываются от аккумулятора через Solar Power Manager.
Модуль 2: Радио-управление (nRF24L01)
Два модуля nRF24L01 обеспечивают радиоканал для ближнего управления ровером. Один модуль (передатчик) подключается к джойстикам на стороне оператора, второй (приёмник) — к Arduino на ровере. Джойстик 1 управляет движением платформы, джойстик 2 — сервоприводом (например, для поворота камеры или манипулятора).
Модуль 3: Программное обеспечение и облачные сервисы
Код передатчика (Arduino + nRF24L01)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CSN, CE
const byte address[6] = "00001";
int x_key = A1, y_key = A0, p_key = A3, q_key = A2;
int x_pos, y_pos, p_pos, q_pos, pos;
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.setChannel(87);
radio.setDataRate(RF24_250KBPS);
radio.stopListening();
Serial.begin(9600);
pinMode(x_key, INPUT); pinMode(y_key, INPUT);
pinMode(p_key, INPUT); pinMode(q_key, INPUT);
}
void loop() {
x_pos = analogRead(x_key); y_pos = analogRead(y_key);
p_pos = analogRead(p_key); q_pos = analogRead(q_key);
if (p_pos > 400 && p_pos < 600 && q_pos > 400 && q_pos < 600) {
if (x_pos > 400 && x_pos < 600 && y_pos > 400 && y_pos < 600) pos = 100; // Стоп
else if (x_pos > 400 && x_pos < 600 && y_pos < 400) pos = 200; // Вперёд
else if (x_pos > 400 && x_pos < 600 && y_pos > 600) pos = 300; // Назад
else if (y_pos > 400 && y_pos < 600 && x_pos < 400) pos = 400; // Влево
else if (y_pos > 400 && y_pos < 600 && x_pos > 600) pos = 500; // Вправо
radio.write(&pos, sizeof(pos));
} else if (p_pos < 400 || p_pos > 600) {
pos = (p_pos < 400) ? 600 : 700; // Серво: 90° или 180°
radio.write(&pos, sizeof(pos));
}
delay(100);
}
Код приёмника (Arduino + nRF24L01 + Серво)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
RF24 radio(7, 8);
const byte address[6] = "00001";
Servo servo;
int pos;
void setup() {
Serial.begin(9600);
radio.begin();
servo.attach(9);
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.setChannel(87);
radio.setDataRate(RF24_250KBPS);
radio.startListening();
pinMode(3, OUTPUT); pinMode(4, OUTPUT);
pinMode(5, OUTPUT); pinMode(6, OUTPUT);
}
void loop() {
if (radio.available()) {
radio.read(&pos, sizeof(pos));
switch (pos) {
case 100: digitalWrite(6,LOW); digitalWrite(5,LOW); digitalWrite(4,LOW); digitalWrite(3,LOW); break;
case 200: digitalWrite(6,HIGH); digitalWrite(5,LOW); digitalWrite(4,HIGH); digitalWrite(3,LOW); break;
case 300: digitalWrite(6,LOW); digitalWrite(5,HIGH); digitalWrite(4,LOW); digitalWrite(3,HIGH); break;
case 400: digitalWrite(6,LOW); digitalWrite(5,HIGH); digitalWrite(4,HIGH); digitalWrite(3,LOW); break;
case 500: digitalWrite(6,HIGH); digitalWrite(5,LOW); digitalWrite(4,LOW); digitalWrite(3,HIGH); break;
case 600: servo.write(90); break;
case 700: servo.write(180); break;
}
delay(10);
} else {
Serial.println("connection lost");
}
}
Облачный мониторинг через Telegram (Python на сервере)
Скрипт на Python (например, на Replit) периодически опрашивает Bolt Cloud, считывает значение датчика влажности (пин 4) и при превышении порога отправляет уведомление в Telegram-бот.
import requests, json, time
from boltiot import Bolt
import conf
mybolt = Bolt(conf.bolt_api_key, conf.device_id)
def get_sensor_value(pin):
try:
resp = mybolt.digitalRead(pin)
data = json.loads(resp)
if data["success"] != 1: return -999
return int(data["value"])
except Exception as e:
print(e); return -999
def send_telegram(msg):
url = f"https://api.telegram.org/{conf.telegram_bot_id}/sendMessage"
data = {"chat_id": conf.telegram_chat_id, "text": msg}
try:
r = requests.get(url, params=data)
return json.loads(r.text)["ok"]
except Exception as e:
print(e); return False
while True:
val = get_sensor_value("4")
if val == -999: time.sleep(10); continue
if val >= conf.threshold:
send_telegram(f"Влажность превысила порог: {val}")
time.sleep(100)
Файл conf.py содержит API-ключи Bolt, ID устройства, токен бота и ID чата Telegram, а также пороговое значение.
Интеграция с Google Assistant, Twilio и Mailgun через Integromat (Make)
Сценарий Integromat принимает вебхук от IFTTT (голосовая команда Google Assistant), запрашивает значение температуры с Bolt Cloud, преобразует сырое значение АЦП в градусы (деление на 10.24 для LM35) и отправляет результат по SMS (Twilio) и Email (Mailgun).
Схемы подключения
В разделе Schematics представлены фото подключения LM35 к Bolt WiFi Module и итоговая схема на макетной плате.
Производственный процесс
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Своё рулевое управление (джойстик) для игр на Arduino