Arduino Ethernet shield server и клиент одновременно

Аппаратное обеспечение:

  • Arduino Mega 2560 Rev3
  • Ethernet Shield Rev3
  • Датчик

Цель:

  • Возьмите значение с датчика и загрузите его в ThingSpeak.
  • Разместите веб-страницу на Arduino.

Вопрос:

В прошлом я делал и то, и другое. Но теперь я хочу загрузить данные в ThingSpeak и одновременно разместить страницу на плате, и это, похоже, не работает. Может, попробовать завести двух клиентов? Я действительно новичок во всех этих сетевых штучках.

В основном я пытаюсь сшить пример кода ThingSpeak с клиентским/серверным кодом Zoomkat. Вот что я пытаюсь сделать. Веб-страница действительно работает, но по какой-то причине она не загружается в ThingSpeak.

//zoomkat 12-08-11, комбинированный клиент и сервер
//простая кнопка GET with iframe code
//для использования с IDE 1.0
//откройте последовательный монитор и отправьте g тестовому клиенту и
//посмотрите, что получает клиент/сервер arduino
//кнопки веб-страницы делают контакт 4 высоким/низким
//используйте косую черту \ , чтобы избежать символа " in the html
//адрес будет выглядеть так http://192.168.1.102:84 при отправке
//для использования с сетевыми экранами на базе W5100

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //физический mac-адрес
IPAddress ip(192, 168, 0, 197); // ip в локальной сети
IPAddress gateway(192, 168, 0, 1); // доступ в интернет через маршрутизатор
IPAddress subnet(255, 255, 255, 0); //маска подсети

// ThingSpeak Settings
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "2M6SFMKICXR7MU1A";
const int updateThingSpeakInterval = 4 * 1000;

// Variable Setup
long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;

EthernetServer server(84); //порт сервера
EthernetClient client;
String readString;

void setup() {
  pinMode(4, OUTPUT); //pin выбран для управления
  Ethernet.begin(mac, ip, subnet, gateway);
  server.begin();
  Serial.begin(9600);
  Serial.println("server/client 1.0 test 12/08/11");
  // следите за тем, что загружается
  Serial.println("Отправить g в последовательный монитор для тестирования клиента");
  // что делать для тестирования клиент
}

void loop() {
  // Печать Ответа на обновление последовательного монитора
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  // Отключиться от ThingSpeak
  if (!client.connected() && lastConnected) {
    Serial.println("...disconnected");
    Serial.println();
    client.stop();
  }

  if(!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval)) {
    Serial.println("sendPost function started");
    sendPost();
  }
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
        }
        //если HTTP-запрос закончился
        if (c == '\n') {
          Serial.println(readString);
          //печать на последовательный монитор для отладки
          //теперь выведите заголовок данных HTML
          if (readString.indexOf('?') >= 0) { //не отправлять новую страницу
            client.println("HTTP/1.1 204 ");
            client.println();
            client.println();
          } else {
            client.println("HTTP/1.1 200 OK"); //отправить новую страницу
            client.println("Content-Type: text/html");
            client.println();
            client.println("<HTML>");
            client.println("<HEAD>");
            client.println("<TITLE>Тестовая страница Arduino</TITLE>");
            client.println("</HEAD>");
            client.println("<BODY>");
            client.println("<H1>ЭТО ТЕСТ</H1>");
            client.println("</BODY>");
            client.println("</HTML>");
          }
          delay(1);
          //остановка клиента
          client.stop();
          readString = "";
        }
      }
    }
  }
}

void sendPost() {
  Serial.println("функция инициирована");
  client.stop();
  String tsData = String(analogRead(A0), DEC);
  if (client.connect(thingSpeakAddress, 80)) {
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");
    client.print("field1=");
    //// is this the prob?
    client.print(tsData);
    lastConnectionTime = millis();
    if (client.connected()) {
      Serial.println("Подключение к ThingSpeak...");
      Serial.println();
      failedCounter = 0;
    } else {
      failedCounter++;
      Serial.println("Подключение к ThingSpeak, ошибка ("+String(failedCounter, DEC)+")");   
      Serial.println();
    }
  } else {
    failedCounter++;
    Serial.println("Подключение к ThingSpeak, ошибка ("+String(failedCounter, DEC)+")");   
    Serial.println();
    lastConnectionTime = millis(); 
  }
}

, 👍3

Обсуждение

С какой проблемой вы столкнулись? Чего вы ожидаете? Пожалуйста, отредактируйте свой вопрос, чтобы включить именно то, что вам нужно. Спасибо!, @Anonymous Penguin

Я не знаю, как создать единую программу, которая выполняла бы как серверные, так и почтовые запросы к ThingSpeak., @user3649886

Я отредактировал вопрос с помощью кода, который пытаюсь использовать., @user3649886

Я думаю, что вы хотите посмотреть тайм-ауты, а затем в цикле опроса, чтобы увидеть, есть ли какие-либо данные для отправки в сокет. То, что вы хотите сделать, обычно достижимо, но я не знаю, сможете ли вы сделать это с помощью этой библиотеки. Альтернативой является использование двух ардуино и заставить их говорить через сериал., @Code Gorilla


1 ответ


-1

Цель правильная. Кажется, что маршрутизация отсутствует для вашего сервера. Вот так:

server.on("/", handleRoot);
server.onNotFound(handleNotFound);
server.begin();
,

в скетче не используется библиотека веб-сервера (esp8266) , @Juraj