Majordomo+arduino+esp8266

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
vasyaka666
Сообщения: 23
Зарегистрирован: Вт фев 23, 2016 11:05 am
Благодарил (а): 0
Поблагодарили: 0

Majordomo+arduino+esp8266

Сообщение vasyaka666 » Пн янв 30, 2017 7:00 am

Приветствую всех!
Народ, кому не лень, объясните, пожалуйста на пальцах, с простеньким примером, как организовать такую работу:
1.вот есть у меня ESP8266 c прошивкой от wifi-iot. в мажордомо все данные с него успешно отправляются.
2. Есть Ардуино, без интернет модуля, подключен по УСБ - им так же все успешно управляется с мажордомо.
В ардуино залит такой вот скетч:
СпойлерПоказать
int sensorValue = 0;
int sensorPin = A0;
int suho = 600;
int incomingInt = 0;
int Relay = 4; // реле 4
int Relay2 = 5; // реле 5
long previousMillis = 0;
long interval = 20000;
// переменные
int buttonState = 0; // переменная для хранения состояния кнопки
int buttonState10 = 0; // переменная для хранения состояния кнопки
const int gassensorpin = A5; //Объявляем переменную для сенсора газа, указываем пин
int gassensorvalue = 0; //Объявляем переменную для хранения значения с датчика газа и приравниваем ее к 0


boolean status;


char buf[80];

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
Serial.println(buf);
}
// задаем константы
const int buttonPin = 8; // номер входа, подключенный к кнопке
const int buttonPin10 = 9; // номер входа, подключенный к кнопке

void setup()
{
Serial.begin(115200);
// инициализируем пины, подключенные к реле 4 и 5, как выходы
pinMode(Relay, OUTPUT);
pinMode(Relay2, OUTPUT);
// инициализируем пины, подключенные к кнопке, как входы
pinMode(buttonPin, INPUT);
pinMode(buttonPin10, INPUT);


}

void loop()

{
if (Serial.available() > 0)
{
incomingInt = Serial.parseInt();
if (incomingInt == 500) {
digitalWrite(Relay, LOW);
sprintf(buf, "GET /objects/?object=Switch1&op=m&m=turnON_ard&", 1) ;
sendHTTPRequest();
}
if (incomingInt == 600) {
digitalWrite(Relay2, LOW);
sprintf(buf, "GET /objects/?object=Switch2&op=m&m=turnON_ard&", 1) ;
sendHTTPRequest();
}
if (incomingInt == 499) {
digitalWrite(Relay, HIGH);
sprintf(buf, "GET /objects/?object=Switch1&op=m&m=turnOff_ard&", 1) ;
sendHTTPRequest();
}
if (incomingInt == 599) {
digitalWrite(Relay2, HIGH);
sprintf(buf, "GET /objects/?object=Switch2&op=m&m=turnOff_ard&", 1) ;
sendHTTPRequest();
}

}
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {
if (status == true) {
digitalWrite(Relay, LOW);
status = false;
delay(200);
sprintf(buf, "GET /objects/?object=Switch1&op=m&m=turnON_ard&", 1) ;
sendHTTPRequest();
}
else
{
digitalWrite(Relay, HIGH);
status = true;
delay(200);
sprintf(buf, "GET /objects/?object=Switch1&op=m&m=turnOff_ard&", 1) ;
sendHTTPRequest();
}
}

buttonState10 = digitalRead(buttonPin10);


if (buttonState10 == HIGH) {
if (status == true) {
digitalWrite(Relay2, LOW);
status = false;
delay(200);
sprintf(buf, "GET /objects/?object=Switch2&op=m&m=turnON_ard&", 1) ;
sendHTTPRequest();
}
else
{
digitalWrite(Relay2, HIGH);
status = true;
delay(200);
sprintf(buf, "GET /objects/?object=Switch2&op=m&m=turnOff_ard&", 1) ;
sendHTTPRequest();
}
}
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// сохраняем время последнего переключения
previousMillis = currentMillis;

sensorValue = analogRead(sensorPin);
// Serial.println(sensorValue);

if (sensorValue < 500)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=plants_wet&", 1) ;

if (sensorValue >= 500 && sensorValue < 900)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=plants_norm&", 1) ;

if (sensorValue > 900)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=Plants_dry&", 1) ;
Serial.println(sensorValue);
sendHTTPRequest();
gassensorvalue = analogRead(gassensorpin);//Считываем значение с датчика газа
if (gassensorvalue < 100)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=plants_clean&", 1) ;

if (gassensorvalue >= 100 && gassensorvalue < 300)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=plants_ok&", 1) ;

if (gassensorvalue > 300)
sprintf(buf, "GET /objects/?object=Plant1&op=m&m=Plants_gas&", 1) ;
Serial.println(gassensorvalue);

sendHTTPRequest();

}
}
Хочу избавиться от подключения ардуины по усб и сделать так, чтобы все работало так же, как и сейчас, но данные бы с ардуины в мажордомо и обратно ходили по сети...
Подскажите, как правильней и дешевле это можно сделать?
1. Можно ли для этих целей использовать ESP8266? Что тогда нужно изменить в скетче? И какие настройки делать в ЕСП, чтобы через него данные с ардуины уходили в мажордомо и обратно?
2. Или, как я понимаю, будет проще купить модуль для ардуины?Какой лучше - W5100 или enc28j60 ? И что в этом случае изменить в скетче, чтобы данные шли по сети?
Огромное спасибо, если поможете. Всю голову уже сломал над этим вопросом))
Руслан
Сообщения: 193
Зарегистрирован: Чт дек 17, 2015 10:08 am
Откуда: Уфа
Благодарил (а): 36 раз
Поблагодарили: 14 раз

Re: Majordomo+arduino+esp8266

Сообщение Руслан » Пн янв 30, 2017 7:29 am

Поисковиком совсем не охота пользоваться?
viewtopic.php?f=8&t=3252&p=38893&hilit= ... art#p38893
В wifi-iot прошивке тоже UART bridge есть. Ваши числа (600, 500 и т.д.) можно и откуда отправлять и думаю все также будет управлятся.
vasyaka666
Сообщения: 23
Зарегистрирован: Вт фев 23, 2016 11:05 am
Благодарил (а): 0
Поблагодарили: 0

Re: Majordomo+arduino+esp8266

Сообщение vasyaka666 » Вт янв 31, 2017 4:16 am

Я читал эту статью, но все равно не могу разобраться.
в прошивке WiFi-Iot есть UART bridge. описание у него такое:
СпойлерПоказать
Вывод своих устройств на базе любого м/к в сеть. Обмен данными UART по MQTT ИЛИ HTTP (MajorDoMo или TCP клиент) .Отправка в UART: Формат для MQTT : Имя_устройства/метрика пробел значение. Использовать только ASCII. Формат для HTTP : &name1=val1&name2=val2. Вывод Only print - вывод только на страничке ip_adr/uartbrprint. Прием в UART: Для MQTT необходимо указать маску топика, а так же указать нужно ли весь топик отправлять в uart или только одну метрику. Для HTTP отправить данные можно ip_adr/uartbrget?data=строка . Нельзя использовать совместно с другими UART опциями !
Я совсем не силен в программировании и все делал по примерам. в ардуине надо править скетч?или нужно править в мажордомо код кнопки?
СпойлерПоказать
$cmdUrl = "http://127.0.0.3:8080/command?500"; getURL($cmdUrl,0);
$this->setProperty("status",1);
akouz
Сообщения: 254
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 41 раз

Re: Majordomo+arduino+esp8266

Сообщение akouz » Вт янв 31, 2017 4:51 am

vasyaka666 писал(а): Хочу избавиться от подключения ардуины по усб и сделать так, чтобы все работало так же, как и сейчас, но данные бы с ардуины в мажордомо и обратно ходили по сети...
Подскажите, как правильней и дешевле это можно сделать?
Для этого надо выбросить модуль Ардуино. "Скрипач не нужен" (с). ESP8266 сам может исполнять ардуиновский скетч, внешняя Ардуина ему для этого не нужна. Надо просто добавить модули ESP8266 к среде разработки Ардуино и использовать их вместо "родных" модулей Ардуино. ESP8266 намного мощнее любой 8-битной Ардуины, в нем стоит быстрый 32-битный процессор и есть дофига памяти. Места для библиотек и скетчей полнО. Читайте https://github.com/esp8266/Arduino и https://esp8266.ru/category/esp8266/esp ... duino-ide/
Ответить