Отправка данных датчика arduino через Wi-Fi на сервер MySQL
Я знаю, что этот вопрос, вероятно, задавали много раз, но я рву на себе волосы.
Я пытаюсь получить данные датчиков с arduino на сервер MySQL. Я проверил журнал доступа apache, и запрос там есть. Но он просто не вставляется в базу данных. Ручное добавление данных с помощью браузера работает, поэтому php-код выглядит нормально. Я разрешил apache через брандмауэр и обновил разрешения, но все безрезультатно. Код ниже:
Основной код Arduino:
#include "thingProperties.h"
#include <Arduino_MKRENV.h>
#include <WiFi.h>
WiFiClient client;
void setup() {
// Инициализируйте последовательный и дождитесь открытия порта:
Serial.begin(9600);
// Эта задержка дает возможность дождаться последовательного монитора без блокировки, если
delay(1500);
//Подключение к сети Wi
int status = WL_IDLE_STATUS;
while (status != WL_CONNECTED){
Serial.print("Attempting to connect to SSID: ");
Serial.println(SSID);
status = WiFi.begin(SSID, PASS);
delay(10000);
}
Serial.println("This is connected.");
if (!ENV.begin()) {
Serial.println("Failed to initialize MKR ENV shield!");
while(1);
}
pinMode(2, INPUT);
}
void loop() {
relativeHumidity = int(ENV.readHumidity());
lightIntensity = (ENV.readIlluminance());
airPressure = int(ENV.readPressure(MILLIBAR));
temperature = int(ENV.readTemperature());
if(digitalRead(2) == LOW){
rain = 1;
}else if(digitalRead(2) == HIGH){
rain = 0;
}
Serial.println("httpRequest");
httpRequest();
delay(10000);
}
void httpRequest(){
// если есть успешное соединение:
if (client.connect(SERVER, 80)) {
Serial.println("Connecting to server...");
// отправить HTTP-запрос PUT:
client.print("GET /weather_data.php?temp=");
Serial.println("GET /weather_data.php?);
client.print(temperature);
client.print("&pressure=");
client.print(airPressure);
client.print("&humidity=");
client.print(relativeHumidity);
client.print("&illumination=");
client.print(lightIntensity);
client.print("&rain=");
client.print(rain);
client.print(" ");
client.println("HTTP/1.1");
client.print(" Host: ");
client.println(SERVER);
client.println();
Serial.println("Added.");
} else {
Serial.println("Not connected.");
}
if (client.connected()){
client.stop();
}
}
Свойства вещей.h:
#include <WiFi.h>
#include <SPI.h>
const char THING_ID[] = "c942a18f-7696-4431-952c-76eaea3214ea";
const char SSID[] = SECRET_SSID; // Сетевой SSID (имя)
const char PASS[] = SECRET_PASS; // Сетевой пароль (используется для WPA или используется в качестве ключа для WEP)
const char SERVER[] = SECRET_IP; // IP-адрес сервера
int airPressure;
float lightIntensity;
float relativeHumidity;
bool rain;
float temperature;
@Sam Anderson, 👍1
Обсуждение2 ответа
WiFi.h предназначен для Arduino WiFi shield. Используйте библиотеку WiFiNINA для MKR1010
Внес это изменение, но, похоже, оно все еще не работает, @Sam Anderson
@SamAnderson, может быть, это еще не работает, но с WiFiNINA у этого есть хотя бы шанс сработать., @Juraj
Так что я не совсем понимаю почему, но я начал с нуля, и теперь это работает. Я поместил новый код ниже на случай, если это поможет кому-то в моей ситуации.
// Arduino Low Power - Version: Latest //#include <ArduinoLowPower.h> //#include <ArduinoIoTCloud.h> #include "thingProperties.h" #include <Arduino_MKRENV.h> /* Repeating Wifi Web Client This sketch connects to a a web server and makes a request using a WiFi equipped Arduino board. created 23 April 2012 modified 31 May 2012 by Tom Igoe modified 13 Jan 2014 by Federico Vanzati http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating This code is in the public domain. */ #include <SPI.h> #include <WiFiNINA.h> int status = WL_IDLE_STATUS; // Initialize the Wifi client library WiFiClient client; void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true); } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to Wifi network: while (status != WL_CONNECTED) { //Serial.print("Attempting to connect to SSID: "); //Serial.println(SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(SSID, PASS); // wait 10 seconds for connection: delay(10000); } // you're connected now, so print out the status: //printWifiStatus(); //Start arduino cloud. //ArduinoCloud.begin(ArduinoIoTPreferredConnection); //Begin ENV shield. if (!ENV.begin()) { Serial.println("Failed to initialize MKR ENV shield!"); while (1); } } void loop() { //ArduinoCloud.update(); // if there's incoming data from the net connection. // send it out the serial port. This is for debugging // purposes only: while (client.available()) { char c = client.read(); Serial.write(c); } //Serial.println("Start reading sensors."); relativeHumidity = int(ENV.readHumidity()); //Serial.println(relativeHumidity); lightIntensity = int(ENV.readIlluminance()); //Serial.println(lightIntensity); airPressure = int(ENV.readPressure(MILLIBAR)); //Serial.println(airPressure); temperature = int(ENV.readTemperature()); //Serial.println(temperature); UV_Index = int(ENV.readUVIndex()); //Serial.println(UV_Index); if (digitalRead(2) == LOW) { rain = 1; } else if (digitalRead(2) == HIGH) { rain = 0; } //Serial.println(rain); //Serial.println("Sensor data read."); //Serial.println("Start http request."); httpRequest(); //Serial.println("Stop http request"); delay(60000); } // this method makes a HTTP connection to the server: void httpRequest() { // close any connection before send a new request. // This will free the socket on the Nina module client.stop(); // if there's a successful connection: if (client.connect(server, 80)) { //Serial.println("connecting..."); // send the HTTP PUT request: client.print("GET /weather_data.php?temp="); client.print(temperature); client.print("&pressure="); client.print(airPressure); client.print("&humidity="); client.print(relativeHumidity); client.print("&illumination="); client.print(lightIntensity); client.print("&UV_Index="); client.print(UV_Index); client.print("&rain="); client.print(rain); client.print(" "); client.println("HTTP/1.1"); client.println("Host: 192.168.0.29"); client.println("User-Agent: ArduinoWiFi/1.1"); client.println("Connection: close"); client.println(); } else { // if you couldn't make a connection: //Serial.println("connection failed"); } } void printWifiStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your board's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
Я вижу, вы пользуетесь не библиотекой Wi-Fi, а библиотекой WiFiNINA, @Juraj
- Сообщение WebSocket с Arduino MKR 1010 с использованием библиотек WiFiNINA и ArduinoHttpClient
- Mkr1010 отключается и снова подключается нормально до тех пор, пока не достигнет точки, где он никогда больше не подключится снова
- Как подключиться к Arduino с помощью WiFi?
- ESP8266 не подключается к Wi-Fi
- В чем разница между вариантами RF (wifi, xbee, NRF24L01)
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
- WebSocketsServer.h: No such file or directory
Итак, ваш Arduino использует библиотеку WiFi для отправки HTTP-команд на сервер, на котором работает стек веб-сервера Apache? И вы видите команды, записанные на сервер? Если это так, то вам придется отладить основную часть этого. Хорошо ли сформирована команда при ее получении? Что с этим делается? Вы говорите: "Ручное добавление данных с помощью браузера работает, поэтому php-код выглядит нормально". Это слишком большой скачок. Использование веб-клиента для отправки вашего запроса по сравнению с выполнением его из необработанной команды HTTP GET использует другой путь на вашем сервере., @Duncan C
вставляется ли запись при использовании веб-браузера? ... если это так, скопируйте URL-адрес и включите его в качестве комментария в свой код, @jsotola
Ниже приведен пример запросов непосредственно из журнала доступа: 192.168.0.3 - - [24 / июнь/2020:21:26:58 +0100] " GET /weather_data.php?temp= 32.00& давление = 1009& влажность = 40,00& освещение = 3,23&дождь = 0 HTTP/1.1" 400 311, @Sam Anderson
400 - это код ответа HTTP? смотрите Пример WebClient о том, как распечатать HTTP-ответ в Arduino, @Juraj