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();
}
}
@user3649886, 👍3
Обсуждение1 ответ
▲ -1
Цель правильная. Кажется, что маршрутизация отсутствует для вашего сервера. Вот так:
server.on("/", handleRoot);
server.onNotFound(handleNotFound);
server.begin();
,
@bangkokguy
в скетче не используется библиотека веб-сервера (esp8266) , @Juraj
Смотрите также:
- Использование AysncUDPMessage для ESP32 для отправки строковых данных
- Отправка данных Arduino через Ethernet на сервер PHP.
- Простая веб-страница с Ethernet-шилдом Arduino на SD-карте
- Как создать сервер сокетов Arduino для получения сообщений
- TCP-клиент readStringUntil только при наличии данных
- Как получить ответ HTTP_POST?
- Ethernet Shield не подключается
- Arduino Ethernet Shield часто теряет свой IP-адрес
С какой проблемой вы столкнулись? Чего вы ожидаете? Пожалуйста, отредактируйте свой вопрос, чтобы включить именно то, что вам нужно. Спасибо!, @Anonymous Penguin
Я не знаю, как создать единую программу, которая выполняла бы как серверные, так и почтовые запросы к ThingSpeak., @user3649886
Я отредактировал вопрос с помощью кода, который пытаюсь использовать., @user3649886
Я думаю, что вы хотите посмотреть тайм-ауты, а затем в цикле опроса, чтобы увидеть, есть ли какие-либо данные для отправки в сокет. То, что вы хотите сделать, обычно достижимо, но я не знаю, сможете ли вы сделать это с помощью этой библиотеки. Альтернативой является использование двух ардуино и заставить их говорить через сериал., @Code Gorilla