Страница 1 из 2

Arduino Server + Client

Добавлено: Вт июн 13, 2017 8:22 am
Amarok
Доброго всем дня!
Столкнулся вот с чем: непонимаю как добиться одновременной работы EthernetServer и EthernetClient?
Хочется иметь возможность управлять пинами и считывать их значения как через web-интерфейс, так и через get-запросы. Выходит либо одно, либо другое. Подскажите, пожалуйста, как это сделать и, если можно, покажите простенький скетч.
Используется Arduino Uno + шилд W5100.
СпойлерПоказать

Код: Выделить всё

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

#define DHTTYPE DHT22
#define DHTPIN 9
DHT dht(DHTPIN, DHTTYPE);
int dhtTemp; int dhtHum; int dhtHIC;

/******************** НАСТРОЙКИ ETHERNET ********************/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };// физический mac адрес
byte ip[] = { 192, 168, 0, 9 };                     // ip в lan
byte subnet[] = { 255, 255, 255, 0 };               // маска подсети
byte gateway[] = { 192, 168, 0, 1 };                // шлюз по умолчанию
EthernetServer server(80);                          // порт сервера


void setup()
{
  Ethernet.begin(mac,ip,gateway,subnet);  // инициализировать Ethernet устройства
  server.begin();                         // начать прослушивание клиентов
  dht.begin();
}

void loop()
{
  dhtCheck();
  generateWebPage ();
}

void dhtCheck() {
  dhtTemp = dht.readTemperature();
  dhtHum = dht.readHumidity();
  dhtHIC = dht.computeHeatIndex(dhtTemp, dhtHum, false);
}

void generateWebPage () {
  EthernetClient client = server.available();    // искать клиента
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connnection: close");
  client.println();
  client.println("<html>");
  client.println("<head>");
  client.println("<title>Lair module</title>");
  client.println("<meta http-equiv=\"refresh\" content=\"15\">");
  client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>");
  client.println("</head>");
  client.println("<body>");
  client.println("<table>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<center>"); client.println("<b>Климат</b>"); client.println("</center>");
     client.println("</td>");
    client.println("</tr>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<b>Температура: </b>"); if (dhtHIC > 0) {client.print("+");} client.print(dhtHIC); client.println("°");
     client.println("</td>");
    client.println("</tr>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<b>Влажность: </b>"); client.print(dhtHum); client.println("%");
     client.println("</td>");
    client.println("</tr>");
  client.println("</table>");
  /*
  client.println("<h2>Observing State Of Switch</h2>");

  client.print("<h2>Switch is:  </2>");

  if (digitalRead(8))
  {
    client.println("<h3>ON</h3>");
  }
  else
  {
    client.println("<h3>OFF</h3>");
  }
  */
  client.println("</body>");
  client.println("</html>");
  delay(1);         // даем время, чтобы принять данные
  client.stop();
}
// http://tehnopage.ru/ethernet-shield-w5100
// http://radioprog.ru/post/109
 
Как сделать, чтоб по-мимо отображения веб-страницы ещё проводилась отправка примерно такого get-запроса:

Код: Выделить всё

http://192.168.0.251:80/objects/?script=tempupdated&temp=dhtTemp&hum=dhtHum 
каждую минуту или при изменении температуры?

Re: Arduino Server + Client

Добавлено: Вт июн 13, 2017 8:24 am
nick7zmail
Ams отлично с этим справляется...но там по-моему переписанная библиотека Ethernet

Отправлено с моего Xperia Z через Tapatalk

Re: Arduino Server + Client

Добавлено: Вт июн 13, 2017 8:26 am
Amarok
nick7zmail писал(а):Ams отлично с этим справляется...но там по-моему переписанная библиотека Ethernet

Отправлено с моего Xperia Z через Tapatalk
амс мне не нужен. он только на мегу вливается

Re: Arduino Server + Client

Добавлено: Вт июн 13, 2017 9:23 am
nick7zmail
Ну во-первых не только на мегу)) https://hi-lab.ru/arduino-mega-server/details/download
Во-вторых я и не предлагал взять амс...я лишь сказал, что там библиотека ethernet переписанная (на сколько я знаю) под эти нужды...можно взять её, и примеры использования подглядеть в амс. А именно выдернуть один из циклов, и на него всё завязать.

Re: Arduino Server + Client

Добавлено: Вт июн 13, 2017 9:52 am
Amarok
nick7zmail писал(а):Ну во-первых не только на мегу)) https://hi-lab.ru/arduino-mega-server/details/download
На uno не вливается(

Re: Arduino Server + Client

Добавлено: Вт июн 13, 2017 9:55 am
serghei
Скорее всего тут либо сервер , либо клиент. В первом случае ардуина делает все сама - отсылает состояное и данные , а так же получает команды из МД. Если вырезать Веб , то в UNO может и влезет, но смысла в этом нет. Библиотека переписана.

Re: Arduino Server + Client

Добавлено: Сб июн 17, 2017 1:03 pm
Amarok
Дело в том, что я хочу реализовать связку arduino + свой сервер (Majordomo). Ардуинка мониторит подключенные к ней датчики (температура, влажность, освещенность, движение и т.д.), выполняет какие либо действия при изменении значений датчиков и выводит состояния подключенных сенсоров на свою веб страницу (в примере за это отвечает функция generateWebPage). При этом, ардуинка должна с какой либо периодичностью (к примеру: каждые 3 минуты) или по событию (сработал датчик движения) скидывать значения датчиков на мой сервер.

Также нужно научить Arduino ПРИНИМАТЬ команды (к примеру зажигать или гасить светодиод) от основного сервера.

Установить Arduino Mega Server на Arduino UNO нет возможности, а опыта для "кастрации" AMS пока ещё не имею. Конечно, можно воспользоваться WiFiGate из соответствующей темы, но и тут неприятности:
1) частенько WiFiGate высылает Алисе "мусор"
2) приём команд банально не работает

Re: Arduino Server + Client

Добавлено: Сб июн 17, 2017 5:01 pm
nick7zmail
А его не надо кастрировать)) вы что, он хочет жить и размножаться)))
Я предложил лишь наглым образом стырить оттуда измененную библиотеку ethernet, и делать проект с ней...

И даже если со стандартной библиотекой, если вы хотите страничку - можно же не использовать функцию клинта...и не посылать данные на МД, а заставить МД самого забирать данные со странички через скрипт...и тогда библиотека клиента не понадобится, поправьте, если не прав...

Re: Arduino Server + Client

Добавлено: Вс июн 18, 2017 8:05 am
Amarok
nick7zmail писал(а):И даже если со стандартной библиотекой, если вы хотите страничку - можно же не использовать функцию клинта...и не посылать данные на МД, а заставить МД самого забирать данные со странички через скрипт...и тогда библиотека клиента не понадобится, поправьте, если не прав...
На данном этапе так и сделано - Алиса раз в минуту опрашивает ардуинку, вытаскивает значения и раскладывает их по полочкам, но хочется именно отправку значений датчиков по событию (к примеру: сработал датчик движения)

Re: Arduino Server + Client

Добавлено: Вс июн 18, 2017 9:04 am
xor
А разве не так делается:
контроллер как сервер - слушает и исполняет внешние команды
если надо что-то сказать, переключается в режим клиента, говорит и возвращается в режим сервера?