Согласование кнопки на браузере и кнопки на ардуино
- Войдите на сайт для отправки комментариев
Втр, 21/11/2017 - 07:57
Добрый день!
Есть UNO, Ethernet shield, кнопка, реле, светодиод
Хотел реализовать проект, где через кнопки на браузере и кнопки на ардуино можно управлять реле. Состояние реле должен отображаться на браузере. Но реле управляется только через кнопки на ардуино, а команды от кнопки на браузере не понимает. Помогите, пожалуйста! Ниже код
#include <SPI.h> #include <Ethernet.h> #include <Bounce.h> byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 }; EthernetClient client; char server[] = "shdomm.000webhostapp.com"; // имя вашего сервера www.arduino.ru int buff=0; const int ledPin=8; int butt; int button = 2; int ledValue = HIGH; Bounce bouncer = Bounce(button,50); void setup() { Serial.begin(9600); Ethernet.begin(mac); pinMode(ledPin, OUTPUT); pinMode(button, INPUT); digitalWrite(ledPin, LOW); } void loop() { if (buff == 1) ledValue = HIGH; else if (buff == 2) ledValue = LOW; // Кнопка if(bouncer.update()) { if(bouncer.read() == HIGH) { if(ledValue == LOW) ledValue = HIGH; else ledValue = LOW; } } // Кнопка digitalWrite (ledPin, ledValue); if(ledValue == HIGH) butt = 1; else if(ledValue == LOW) butt = 2; if (client.connect(server, 80)) { client.print( "GET /add_data.php?"); client.print("button="); client.print(butt); client.println( " HTTP/1.1"); client.print( "Host: " ); client.println(server); client.println( "Connection: close" ); client.println(); client.println(); delay(500); while (client.available()){ char c = client.read(); Serial.print(c); if (c =='1') buff=1; else if (c =='2') buff=2; } client.stop(); client.flush(); delay(100); } else { client.stop(); delay(1000); client.connect(server, 80);} delay(500); }
Код на сервере add_data.php
<?php $S1 = $_GET['button']; $myFile1 = "txt/out-1.txt"; $fh1 = fopen($myFile1, 'w') or die("can't open file"); fwrite($fh1, $S1); fclose($fh1); $myFile = "txt/out-1.txt"; $fh = fopen($myFile, 'r'); $theData = fread($fh, filesize($myFile)); fclose($fh); echo $theData; ?>
А состояние реле в браузере отображается, если им с ардуино управлять?
Да, состояние отображается. С ардуино управлять можно. Но с браузера не получается
По отдельности они работают, т.е. управление реле с ардуино и с браузера
А когда их совмещаю тупняк
Читать про то, что такое HTTP и как посредством этого протокола происходит общение сервера с клиентом. Хинт: там есть всякие служебные заголовки, то, что делаете вы - работать не будет, т.к. сервер выдаёт первой строчкой ответа код ответа и версию протокола, вроде этой "HTTP/1.1 200 OK". Далее могут быть ещё строчки, тело ответа вашего скрипта идёт после двух переводов строки.
Спасибо за советы! Теперь знаю куда копать дальше
Спасибо за советы! Теперь знаю куда копать дальше
Прошу Вас подсказать куда копать т.к. у меня знаний не достаточно в php но если ткнуть в место где ошибка думаю размберусь .
Уже неделю по ночам сижу и не могу понять уже все перепробовал, что интересно у других тоже встречалась такая проблема но нигде нет ответа кто как решил
Очень прошу всех о помощи. заранее благодарен
Данные в файле out-1.txt в котрый записываеться потожение включателя записываються корректно (0 или 1 )
Добавил ранее пару строк для выводжа в сериал инфо от сайта и действительно вижу там что-то типа такого когда состояние включателя "включено "
Первоисточник https://m.geektimes.com/post/255546/
index.php — панель управления
add_data.php — файл обрабатывающий запросы с контроллера и отсылающий ответ обратно на arduino
style.css — определяет внешний вид панели
Папка transfer — содержит файлы, с помощью которых происходит считывание и запись значений из текстовых файлов.
led.php — записывает состояние выхода в файл out-1.txt, отправленное через форму в панели управления
ledstate.php — считывает состояние из текстового файла out-1.txt и выводит на панели в виде «ON» или «OFF»
temp-1.php и temp-2.php — считывают значения температуры из файлов in-1.txt и in-2.txt и отправляют на панель управления.
Папка txt — своего рода база данных для хранения информации.
Использую тот же код
Вот код add_data.php
вопрос-то в чем?
Насколько я понимаю причина в точ что в сериал кроме изменяющегося значения 0 или 1 выводиться куча другой инфо
потому ардуина не может включить светодиод ?!
вопрос-то в чем?
Спасибо что откликнулись и потратили свое время .
Вопрос: что мне поправить в коде на дуне или в скриптах на сайте чтоб я мог включать светодиод через свой сайт или куда смотреть ?
Прошу прошение сразу не описал суть проекта.
Создан сайт через который происходит управление и на котором отображаеться темепратура
Температура отображаеться а включатель не работает
Вот и ищу проблему
Термины "отладка", "контрольная точка" вам знакомы?
http://startingelectronics.org/tutorials/arduino/ethernet-shield-web-ser...
Почитайте весь цикл статей, ам еще есть ссылки в ютуб, оно тоже интересно
к сожелению не очень, больше поверхностное представленте. Но почитаю
благодарю, посмотрю . Мне кажеться что в скетче ардуино нужно от буфера отказаться и заменить его логической, но не хватает уверенности что в этом причина
http://startingelectronics.org/tutorials/arduino/ethernet-shield-web-ser...
Почитайте весь цикл статей, ам еще есть ссылки в ютуб, оно тоже интересно
я правильно понимаю, вы имеете ввиду что скетч ардуины ни причем ?
Неправильно.
Слово СКЕТЧ - непристойность. Есть программа , написанная на С.
там есть программа на С, подгружающая html по запросу бровсера, , html , который показывает страницу в бровсере и джаваскрипт, который, взаимодействуя с С, обновляет данные на этой странице в бровсере, в тч, обслуживая и синхронизируя активные элементы страницы с переменными в С.
Неправильно.
Слово СКЕТЧ - непристойность. Есть программа , написанная на С.
там есть программа на С, подгружающая html по запросу бровсера, , html , который показывает страницу в бровсере и джаваскрипт, который, взаимодействуя с С, обновляет данные на этой странице в бровсере, в тч, обслуживая и синхронизируя активные элементы страницы с переменными в С.
Может проблема в том, что кроме логического ответа 0 или 1 куча инфо выводиться ? Может нужно условие задать по другому ?
char chNext = client.read();
if (chNext == 'r')
Не судите строго, только учусь. До этого только готовые программы редактировал
хе, долго ковырялся с данным проектом, могу помоч, "свой сайт" у Вас такой же как в примере?
еще у Вас серверная часть поднята на винде или линуксе
хе, долго ковырялся с данным проектом, могу помоч, "свой сайт" у Вас такой же как в примере?
Буду очень признателен за помощь потому что сам пока не разобрался .
Сайт такой же, пока рано самому что-то менять пока не заработал исодный пример.
Спасибо
еще у Вас серверная часть поднята на винде или линуксе
-сервер на php расположенный на хостинге который привязанный к доменному имени
— клиент в виде arduino
— панель управления
с хостингом не особо подскажу, серверную часть делал на линуксине. 1 что нужно проверить права файлов php и текстовых файлов . т.к. add_data только принимает и отдает данные ардуине. в index при нажатии кнопки записывает значение 0 или 1 через файл led в текстовый файл.
для проверки посморите текстовый файл при нажатии кнопки меняется ли значение?
с хостингом не особо подскажу, серверную часть делал на линуксине. 1 что нужно проверить права файлов php и текстовых файлов . т.к. add_data только принимает и отдает данные ардуине. в index при нажатии кнопки записывает значение 0 или 1 через файл led в текстовый файл.
для проверки посморите текстовый файл при нажатии кнопки меняется ли значение?
проверял, в файле меняеться, но на дуне ничего не происходит.
мало того в сериале тоже выводиться положение включателя просто прежде выходит служебный заголовок я так понимаю из-за него не срабатывает
скинте сообщение с сериала и добавте в код serial.print(buff);
67
client.stop();
68
delay(1000);
69
client.connect(server, 80);
70
}
71
72
if
( buff==1)
73
{
74
digitalWrite (led, HIGH);
75
}
76
else
77
{
78
digitalWrite(led, LOW);
79
}
serial.print(buff);
80
delay(500);
81
}
посмотрите при нажатии кнопки будет ли меняться значение buff
01
#include <SPI.h>
02
#include <Ethernet.h>
03
#include <OneWire.h>
04
#include <DallasTemperature.h>
05
06
#define ONE_WIRE_BUS 2
07
OneWire oneWire(ONE_WIRE_BUS);
08
DallasTemperature sensors(&oneWire);
09
10
byte
mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
11
12
EthernetClient client;
13
char
server[] =
"мой сервер"
;
// имя сервера
14
int
buff=0;
15
const
int
led=5;
16
17
void
setup
()
18
{
19
Ethernet.begin(mac);
20
sensors.begin();
21
pinMode( led, OUTPUT);
22
digitalWrite(led, LOW);
23
}
24
25
void
loop
()
26
{
27
28
sensors.requestTemperatures();
29
30
if
(client.connect(server, 80))
31
{
32
33
client.print(
"GET /add_data.php?"
);
34
client.print(
"temperature="
);
35
client.print( sensors.getTempCByIndex(0) );
36
client.print(
"&"
);
37
client.print(
"&"
);
38
client.print(
"temperature1="
);
39
client.print( sensors.getTempCByIndex(1) );
40
client.println(
" HTTP/1.1"
);
41
client.print(
"Host: "
);
42
client.println(server);
43
client.println(
"Connection: close"
);
44
client.println();
45
client.println();
46
47
delay(200);
48
49
while
(client.available())
50
{
51
char
c = client.read();
52
if
( c==
'1'
)
53
{
54
buff=1;
55
}
56
if
( c==
'0'
)
57
{
58
buff=0;
59
}
60
}
61
client.stop();
62
client.flush();
63
delay(100);
64
}
65
else
66
{
67
client.stop();
68
delay(1000);
69
client.connect(server, 80);
70
}
71
72
if
( buff==1)
73
{
74
digitalWrite (led, HIGH);
75
}
76
else
77
{
78
digitalWrite(led, LOW);
79
}
80
delay(500);
81
}
У вас это залито
сделайте последний кусок так
if
( buff==1)
73
{
74
digitalWrite (led, HIGH);
serial.print("vkl");
75
}
76
else
77
{
78
digitalWrite(led, LOW);
serial.print("otkl");
79
}
80
delay(500);
81
}
Александр, спасибо , сегодня вечером попробую сейчас не на месте
у Вас с сервеной частью походу все впорядке, и ардуина вроде принимает, но код у вас походу отличается с с тем что скинули. надо посмотреть где затыка
у Вас с сервеной частью походу все впорядке, и ардуина вроде принимает, но код у вас походу отличается с с тем что скинули. надо посмотреть где затыка
он у меня отличаеться только строками которые я добавил для вывода в сериал т.к. не мог понять принимает ли ардуина команды
после 51строки char c = client.read();
добавил Serial.println(c); в войд сетап вывод на сериал
вечером возьму за основу первоначальный код который тут и перепишу концовку
Если я перепишу строки
Правильно ли я понимаю что с этими строками мы увидим просто в мониторе порта вкл или откл но не понтмаю что нам это даст ?
не будет оно работать. Почитайте. что отвечали ТС в начале темы - например в сообщении №3. У вас та же проблема.
В ответе серевера сотни байт, а вы читаете только один - первый. Этот байт вообще не имеет отношения к состоянию реле.
точно ли принимает ардуина данные ну и например правильность соединения диода, сейчас в сериал срется 3 значения, котрые я не пойму, чуть позже свой сериал скину
да ничего вам это не даст, alexandr777., похоже, понимает в этом коде не больше вашего.
не будет оно работать. Почитайте. что отвечали ТС в начале темы - например в сообщении №3. У вас та же проблема.
В ответе серевера сотни байт, а вы читаете только один - первый. Этот байт вообще не имеет отношения к состоянию реле.
работает, и даже с 8 кнопками
работает, и даже с 8 кнопками
Совершенно очевидно, что - если работает - код там совсем другой. Тот код, что вы советуете - работать не будет.
Спасибо за участие , может вы видите где ошибка ? Буду благодарен, если сможете подсказать.
Может у Вас есть код который загружен что бы я мог сравнить ?
могу скинуть, ток мой под esp сейчас сделан, разница в библиотеке для сетевой карты будет, дай почту
могу скинуть, ток мой под esp сейчас сделан, разница в библиотеке для сетевой карты будет, дай почту
а сюда выложить ? Чтоб другие тоже посмотрели? Или код секретный? :)
OLEG_I - прежде чем читать из ответа сервера состояние кнопки, нужно пропустить все служебные заголовки HTTP. Признаком окончания служебной информации служит пустая строка(два перевода строки подряд) Только после того, как нашли в ответе "\r\n\r\n" - начинайте читать свои нули и единицы.
вот кусок
он у меня отличаеться только строками которые я добавил для вывода в сериал т.к. не мог понять принимает ли ардуина команды
Олег, выложите код, как вы выводили ответ серевера в Сериал.
он у меня отличаеться только строками которые я добавил для вывода в сериал т.к. не мог понять принимает ли ардуина команды
Олег, выложите код, как вы выводили ответ серевера в Сериал.
По памяти такой приду домой проверю
По памяти такой приду домой проверю
И ответ вы получаете примерно такой, верно ? :
Да, получаю такой текст
Да, понимаю но не знаю как избавиться от "служебного текста ”
вот что мне выдает сервер
с браузера набери твойсервер/add_data.php? что ответит?
Notice: Undefined index: temperature in /storage/ssd4/245/5519245/public_html/add_data.php on line 3
Notice: Undefined index: temperature1 in /storage/ssd4/245/5519245/public_html/add_data.php on line 9