Отправка данных датчика 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)
- Контакты RX и TX на esp32
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- 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