Дистанционное управление Arduino
Предположим, я хочу создать Arduino Hubs с исполнительными механизмами и датчиками, но управлять ими нужно дистанционно.
Каково же решение?
Я создал библиотеку Arduino, которая может выполнять следующие действия:
- Для каждого исполнительного механизма/датчика назначаются выводы, имена и некоторые параметры.
- Каждый элемент назначается на центральный командный узел (CentralCommandUnit, CCU), который будет управлять всем процессом с этого момента
Каковы слабые места?
- Это решение находится на ранней стадии, и иногда я вижу проблему, которую необходимо устранить с помощью разрывных изменений
- В настоящее время работает только для значений типа
bool
иint
Предполагаемая публика
Пожалуйста, имейте в виду, что приведенный здесь код, даже для кода "мигания", более многословен, чем в проекте для начинающих. Поэтому это не для тех, кто только начинает работать с Arduino. Вы не увидите pinMode
, analogRead
... потому что этим занимается библиотека.
Давайте приступим!
Библиотека
В IDE Arduino установите Simple Repository IO
Некоторые элементы конструкции
Предмет | Количество |
Arduino | 1 |
Фоторезистор | 1 |
Макетная плата | 1 |
Резистор 220 Ом | 1 |
Светодиод (встроенный) | 1 |
Вывод A0 подключен к резистору и фоторезистору
Вторая ножка резистора подключена к разъему GND
Последняя ножка фоторезистора подключена к напряжению 5 В
Давайте воспользуемся встроенным светодиодом!
Код
// imports
#include "bool_component.h"
#include "ccu.h"
#include "command_factory.h"
#include "percent_component.h"
#include "Simple_Repository_IO.h"
// for this library, we must know only the names
const String led = "led";
const String photoSensor = "photo";
// this one is responsible to execute commands
CentralCommandUnit ccu;
void setup()
{
// creating a new Repository with 2 items
Repository *hub = new Repository("hub", 2);
// LED_BUILTIN >> your IDE knows the builtin led for your Arduino board
// BoolComponent >> this led will turn on or off. This seems to be a boolean for me :)
// Component::IoType::OUT >> we are not reading values, we're showing them
BoolComponent *bc = new BoolComponent(LED_BUILTIN, led, Component::IoType::OUT);
// A0 >> analogic input pin
// PercentComponent >> the value starts at 0 (zero - pitch dark) and goes to 100 ("praise the sun")
// Component::IoType::IN >> we are reading values
PercentComponent *pc = new PercentComponent(A0, photoSensor, Component::IoType::IN);
// adding to the repository
hub->put(0, bc);
hub->put(1, pc);
// starting the Central Command Unit
ccu.setup(hub);
Serial.begin(9600);
// ccu.execute >> tells the ccu to do some command
// CommandFactory::describe() >> this is to create a JSON from your Arduino hub stored into the repository
String result = ccu.execute(CommandFactory::describe());
Serial.println(result);
}
// Please, don't use this library as the example bellow
// This is an example to it running. In the next article, we'll send commands remotely
void loop()
{
// CommandFactory::read(photoSensor) >> asking the current value for the component with the name stored into the variable
String value = ccu.execute(CommandFactory::read(photoSensor));
const bool isBright = value.toInt() > 50;
// CommandFactory::write(led, !isBright) >> change the value of an 'output' component with that name
ccu.execute(CommandFactory::write(led, !isBright));
delay(100);
}
Результаты
- Включить освещение = выключить светодиод
- Выключить освещение (или закрыть фоторезистор) = светодиод включен
Да, код ОЧЕНЬ многословен. Но эта библиотека предназначена для дистанционного управления Arduino.
Следующие шаги
- Подключите Arduino к серверу
- Получите команды
- Верните данные
- Создайте API для получения/настройки информации о хабах
- Создайте приложение React Native для работы с данными