Управление ардуино через интернет


Взято на просторах интернета, проверено работает! http://arduino.ru/forum/programmirovanie/upravlenie-relyushchkami-cherez-inet

 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 0, 177 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 4;
int pins[] = { 2, 3, 4, 5 }; // Пины для реле
int pinState[] = {0, 0, 0, 0}; // Состояние пинов

void setup()
{
// Изначально выключаем все реле
for (int i = 0; i < numPins; i++)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}

Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}

void loop()
{
EthernetClient client = server.available();
if (client)
{
// Проверяем подключен ли клиент .


ak;
if (ch == ‘n’ && i < dataCount — 1)
{
// Находим строку, в которой содержатся передаваемые данные
char chNext = client.read();
// Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
if (chNext == ‘r’)
{
// Выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;

// Считываем первый номер реле, который нужно включить
char relayNum = client.read();
pinState[relayNum-‘0’] = 1;
Serial.write(relayNum);

// Считываем вспомогательную информацию (=on&)
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();

// Пока есть данные об остальных реле, считываем и заносим в массив pinState
while (relayNum != -1)
{
relayNum = client.read();
relayNum = client.read();
pinState[relayNum-‘0’] = 1;
Serial.write(relayNum);
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
}
} else
{
// Если не было передано данных, то выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
}
}
}
}


// В соответствие с переданными данными включаем реле
for (int i = 0; i < 4; i++)
{
digitalWrite(pins[i], !pinState[i]);
}

// Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
client.println(«HTTP/1.1 200 OK»);
client.println(«Content-Type: text/html»);
client.println();
client.println(«<html>»);
client.println(«<head>»);
client.println(«<title>Zelectro. Relay + Ethernet shield.</title>»);
client.println(«</head>»);
client.println(«<body>»);
client.println(«<h3>Zelectro. Relay + Ethernet shield.</h3>»);
client.println(«<form method=’post’>»);
client.print(«<div>Relay 1 <input type=’checkbox’ «);
if (pinState[0] == 1)
client.print(«checked»);
client.println(» name=’r0′></div>»);
clien.


<input type=’checkbox’ «);
if (pinState[3] == 1)
client.print(«checked»);
client.println(» name=’r3′></div>»);
client.println(«<input type=’submit’ value=’Refresh’>»);
client.println(«</form>»);
client.println(«</body>»);
client.println(«</html>»);
client.stop();
}
}
}

 

http://arduino.ru/forum/programmirovanie/upravlenie-relyushchkami-cherez-inet

Источник: online-helper.ru

1. Создайте учетную запись Blynk
После загрузки приложения Blynk вам необходимо создать учетную запись Blynk. Эта учетная запись отделена от учетных записей, используемых для форумов Blynk, если у вас уже есть такая.

Мы рекомендуем использовать реальный адрес электронной почты, потому что это упростит ситуацию позже.


Зачем мне нужно создавать учетную запись?
Учетная запись необходима для сохранения ваших проектов и доступа к ним с нескольких устройств из любого места. Это также мера безопасности.

Вы всегда можете настроить свой собственный сервер Private Blynk и иметь полный контроль.

2. Создать новый проект
После того, как вы успешно вошли в свою учетную запись, начните с создания нового проекта.
Дайте ему имя.

3. Выберите оборудование

Выберите модель оборудования, которую вы будете использовать.
Проверьте СЃРїРёСЃРѕРє поддерживаемого оборудования!

4. Маркер аутентификации
Auth Token — уникальный идентификатор, необходимый для подключения вашего оборудования к вашему смартфону. Каждый новый проект, который вы создадите, будет иметь свой собственный токен аутентификации. После создания проекта вы автоматически получите токен аутентификации в электронном письме. Вы также можете скопировать его вручную.
Выберите раздел устройств > Нажмите на устройстве > И вы увидите токен

ПРИМЕЧАНИЕ: Не передавайте свой токен аутентификации никому, если только вы не хотите, чтобы у кого-то был доступ к вашему оборудованию.

Очень удобно отправить по электронной почте. Нажмите кнопку электронной почты, и маркер будет отправлен на адрес электронной почты, который вы использовали для регистрации. Вы также можете нажать на линию Token, и он будет скопирован в буфер обмена.
Теперь нажмите кнопку «Create».


5. Добавьте виджет

Холст вашего проекта пуст, добавим кнопку для управления нашим светодиодом.
Нажмите в любом месте на холсте, чтобы открыть окно виджета.
Здесь находятся все доступные виджеты.
Теперь выберите кнопку.
Поле виджетов

Drag-n-Drop — нажмите и удерживайте виджет, чтобы перетащить его в новую позицию.
Настройки виджетов — каждый виджет имеет свои собственные настройки.
Нажмите на виджет, чтобы добраться до них.

Наиболее важным параметром является PIN. Список контактов отображает физические контакты, определяемые вашим оборудованием. Если ваш светодиод подключен к цифровому выступу 8 — выберите D8 (D — означает Digital/Цифровой).

6. Запуск проекта
Когда вы закончите настройку — нажмите кнопку PLAY. Это переключит вас из режима EDIT в режим PLAY, где вы сможете взаимодействовать с оборудованием. В режиме воспроизведения вы не сможете перетаскивать или настраивать новые виджеты, нажмите STOP и вернитесь в режим EDIT.

Вы получите сообщение о том, что «Arduino UNO is offline». Мы рассмотрим это в следующем разделе.

Источник: 4pda.ru

Управление ардуино через интернет


Всем добрый день.

Около года назад я написал небольшую обзорную статью для управления Arduino через интернет, с помощью сервера NinjaBlocks. Это было довольно хорошее и удобное решение и оно отлично работало, пока в один прекрасный момент не начались проблемы с соединением. Попытки уговорить разработчиков через форум решить проблемы были напрасны — они просто игнорировали мои просьбы и не удосужились даже ответить, что было очень печально.

С того момента был просканирован весь интернет в поисках замены — и было найдено много очень интересных проектов, но они либо были слишком сложными в реализации и требовали значительных знаний в области программирования, либо были попросту неудобны. И вот тут и пришла мысль почему бы не сделать все самому.

Конечно очень хотелось использовать современные протоколы передачи данных websockets или mqtt, которые позволили бы контролировать все процессы в реальном времени, но если с клиентом для arduino дела обстояли хорошо — наличие неплохих библиотек радовало, то вот с серверной стороной дела обстояли хуже — нужны были серверы с поддержкой нужных протоколов, которых у обычного хостера не было. А заводить свой сервер ради зажигания светодиода не хотелось. И выбор пал на старый и добрый http.

1. Как это всё работает.

У нас имеется:
— сервер на php расположенный на хостинге который привязанный к доменному имени
— клиент в виде arduino
— панель управления


Arduino подключается к серверу и отправляет GET запрос, где содержатся значения датчиков температуры.

Сервер принимает запрос, и записывает значения температур в текстовые файлы. При этом читает из текстового файла значение установленного выхода для arduino и отправляет в ответ на запрос контроллера.

Arduino принимает ответ от сервера и согласно ему устанавливает состояние своего выхода

Панель управления, используя Ajax, считывает значение температуры из текстовых файлов и обновляет показания датчиков. А также считывает их текстового файла состояние выхода и обновляет его на странице. С помощью того же Ajax через форму в текстовый файл записывается значение выхода контроллера, откуда потом будет брать значение сервер и отправлять контроллеру.

2. Клиент на Arduino

Скетч довольно простой, всё что он делает — это собирает значение датчиков и отправляет их на сервер, получает ответ, включает или отключает выход.

3. Сервер и панель управления

Сервер состоит всего из нескольких файлов:
Управление ардуино через интернет
index.php — панель управления
add_data.php — файл обрабатывающий запросы с контроллера и отсылающий ответ обратно на arduino
style.css — определяет внешний вид панели
Папка .
Папка txt — своего рода база данных для хранения информации.

Сервер на самом деле очень простой и его сможет установить себе любой человек с минимальными познаниями, например, как я. До работы над этим проектом у меня был опыт работы только с arduino, поэтому php, ajax, html и css пришлось изучать буквально с нуля.

Установка очень простая. Просто скопируйте файлы на сервер и загрузите скетч в контроллер, при этом в скетче подправьте доменное имя, подключите датчики и светодиод, и у вас все должно работать.

Уверен, что матерые программисты будут пинать меня и тыкать носом в те места где можно было бы написать код более лаконично и правильно. Я это только приветствую!!!

Если вы увидели, что некоторые вещи можно сделать проще и быстрее, то сообщите мне.

Что в итоге мы имеем?

Плюсы:

— все просто и понятно
— можно настроить под свои нужды и задачи
— хорошая стабильность
— сервер можно развернуть на любом бесплатном хостинге


Минусы:

— большое количество запросов на сервер ( некоторым хостерам это может не понравиться, в этом случае нужно увеличить паузу между запросами в скетче)
— кушает много трафика со стороны клиента ( при 1 запросе в секунду выходит около 300 Мб в сутки)
— существует небольшая задержка на включение выходов ( может быть критично для некоторых случаев)

Планы на будущее:

— добавить кнопку на контролере для включения и выключения реле с изменением состояния на сервер
— добавить авторизацию
— добавить идентификационные ключи в запросах
— организовать работу нескольких плат одновременно с одной панелью управления
— добавить подтверждения от контроллера о включении выхода
— очень хотелось бы использовать протоколы websockets или mqtt, но всё же склоняюсь к использованию websockets c использованием socket.io

Возможно, если будет интересно, напишу статью об управлении через интернет wifi модулем esp8266. Его я уже успел успешно опробовать и убедился, что все работает, правда, там есть свои нюансы в работе.

А если наберется достаточное количество желающих напишу, будет подробная статья, где мы рассмотрим добавление новых блоков с датчиками и управлением дополнительными выходами в панель управления.

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


Все желающие могут сами посетить страницу моего сервера и проверить в действии arduino.zhodinovel.com
!!! Для изменения выхода контроллера поставьте маркер на нужное значение и нажмите «ОТПРАВИТЬ» !!!

Смотрим видео

Качаем файлы
1. Сервер
2. Скетч для arduino

Всем спасибо за внимание!

UPD. Добавил обратную связь в панель в виде фоторезистора. Когда лампочка выключена, показания около 130, когда включена — 900.

Источник: habr.com

Рис.2. Модуль WIZ812MJ

Программа для Ардуино
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS); //Настройка 1wire для работы с 6-м выводом Ардуино
DallasTemperature sensors(&oneWire); //Подключаем датчик температуры
int ii=1;
int ij=0;
byte r=0,g=0,b=0;
char buf[100];
char bb[40];
// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
0x0E, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,1,30);
// fill in your Domain Name Server address here:
IPAddress myDns(8,8,8,8);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
// initialize the library instance:
EthernetClient client;
int ia=0,ja=0;
int addr = 0;
char server[100];
int buttonState = 1;
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
boolean lastConnected = false; // state of the connection last time through the main loop
const unsigned long postingInterval = 14*1000; // delay between updates, in milliseconds
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v — (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void setup() {
pinMode(3, OUTPUT);  // LED 1
pinMode(4, INPUT);      // Кнопка PD4
pinMode(5, OUTPUT);  // LED 2
pinMode(7, OUTPUT);  // LED 3
// start serial port:
Serial.begin(9600);
// give the ethernet module time to boot up:
delay(1000);
buttonState = digitalRead(4);
// Проверка, нажата ли кнопка PD4 сразу после включения питания
if (buttonState == 0){ // Если нажата, необходимо ввести имя промежуточного сервера
for(ia=0;ia<100;ia++){ addr=ia; EEPROM.write(addr, 0); } // Обнуляем EEPROM
Serial.print(«Input server name: «);
while(Serial.available() <= 0){ ;} // Ожидание ввода
delay(1000); // Задержка для передачи в буфер
ia=0;
while(Serial.available() > 0){
server[ia] = Serial.read(); ja=ia; ia++;} //Чтение данных с клавиатуры
for(ia=0;ia<=ja;ia++){
addr=ia;
EEPROM.write(ia, server[ia]); //Запись в EEPROM
}
Serial.println();
}
for(int ia=0;ia<100;ia++){
addr=ia; server[ia]=EEPROM.read(addr); // Чтение имени сервера с EEPROM
}
Serial.print(«Server name: «); Serial.println(server);
// Определение IP параметров с помощью DHCP
if (Ethernet.begin(mac) == 0) {
Serial.println(«Failed to configure Ethernet using DHCP»);
// initialize the ethernet device not using DHCP:
Ethernet.begin(mac, ip, myDns, gateway, subnet);
}
// start the Ethernet connection using a fixed IP address and DNS server:
// print the Ethernet board/shield’s IP address:
Serial.print(«My IP address: «);
Serial.println(Ethernet.localIP());
Serial.print(«My DNS address: «);
Serial.println(Ethernet.dnsServerIP());
Serial.print(«Gateway address: «);
Serial.println(Ethernet.gatewayIP());
Serial.print(«SubnetMask: «);
Serial.println(Ethernet.subnetMask());
}
void loop() {
// if there’s incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
Serial.print(c);
buf[ii-1]=c; ij=ii;
if(c==’n’) ii=0;
ii++;
}
// if there’s no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.print(«disconnecting. FreeRAM:»);
Serial.println(freeRam());
if(ij<=1) goto lab;
for(ii=0;ii<ij;ii++)
Serial.write(buf[ii]);
Serial.println();
if( buf[1]==’1′) {digitalWrite(3,HIGH);}
if( buf[1]==’0′) {digitalWrite(3,LOW);}
if( buf[2]==’1′) {digitalWrite(5,HIGH);}
if( buf[2]==’0′) {digitalWrite(5,LOW);}
if( buf[3]==’1′) {digitalWrite(7,HIGH);}
if( buf[3]==’0′) {digitalWrite(7,LOW);}
lab:
client.stop();
}
// if you’re not connected, and 14 seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() — lastConnectionTime > postingInterval)) {
httpRequest();
}
if( !client.connected() && buf[0]==’1′ && (millis() — lastConnectionTime > postingInterval/2)) {
httpRequest1();
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
}
// this method makes a HTTP connection to the server:
void httpRequest() {
// if there’s a successful connection:
if (client.connect(server, 80)) {
Serial.println(«connecting_000…»);
// send the HTTP PUT request:
client.println(«GET /comand.html HTTP/1.1»);
client.println(«Host: aaa.aaa.aaa»);
client.println(«User-Agent: arduino-ethernet»);
client.println(«Connection: close»);
client.println();
// note the time that the connection was made:
lastConnectionTime = millis();
}
else {
// if you couldn’t make a connection:
Serial.println(«connection failed»);
Serial.println(«disconnecting.»);
client.stop();
}
}
void httpRequest1() {
// if there’s a successful connection:
if (client.connect(server, 80)) {
Serial.println(«connecting_aaa…»);
sensors.requestTemperatures();
int temp=sensors.getTempCByIndex(0);
if (digitalRead(3)) {r=1;}
else {r=0;}
if (digitalRead(5)) {g=1;}
else {g=0;}
if (digitalRead(7)) {b=1;}
else {b=0;}
// send the HTTP PUT request:
if(r==0&&g==0&&b==0) {sprintf(bb,»GET /c.php?r=0&g=0&b=0&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==1&&g==0&&b==0) {sprintf(bb,»GET /c.php?r=1&g=0&b=0&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==1&&g==1&&b==0) {sprintf(bb,»GET /c.php?r=1&g=1&b=0&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==1&&g==1&&b==1) {sprintf(bb,»GET /c.php?r=1&g=1&b=1&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==0&&g==1&&b==0) {sprintf(bb,»GET /c.php?r=0&g=1&b=0&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==0&&g==1&&b==1) {sprintf(bb,»GET /c.php?r=0&g=1&b=1&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==0&&g==0&&b==1) {sprintf(bb,»GET /c.php?r=0&g=0&b=1&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
if(r==1&&g==0&&b==1) {sprintf(bb,»GET /c.php?r=1&g=0&b=1&t=%2d HTTP/1.1rn»,temp);
for(int i1=0;i1<38;i1++)
client.write(bb[i1]);}
client.println(«Host: aaa.aaa.aaa»);
client.println(«User-Agent: arduino-ethernet»);
client.println(«Connection: close»);
client.println();
}
}
На рисунке 3 показано устройство на микроконтроллере ATmega32, собранное на стенде. Здесь DS18B20 — датчик температуры, LED — три светодиода, вместо которых подключается релейный блок для удаленного управления оборудованием.

Источник: www.sites.google.com


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.