Как отправить данные из firebase php в arduino?

В проекте, над которым я работаю

Я хочу отправить данные в firebase на arduino специально для этого отправка информации для изменения Wi-Fi

SSID

пароль

материалы, которые я использовал:

esp8266-01

ардуино уно r3

firebase

веб-сервер (000webhost)

код для ардуино

    #include <SoftwareSerial.h>
#include <DHT.h>;
SoftwareSerial Serial1(10, 11);
#define Trash "Trash3"
#define DHTTYPE DHT11
#define DHTPIN 2
#define TRIGGER_PIN 4
#define ECHO_PIN 3

DHT dht(DHTPIN, DHTTYPE, 11);

float humidity, temp_f;
int distance;
long duration;


String buff(64);
String getStr(128);

void setup() {

  Serial.begin(9600);

  Serial1.begin(9600);
  //Serial1.resetESP();
  delay(2000);
  Serial1.setTimeout(5000);

  dht.begin();
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  if (!connectWiFi()) {
    Serial.println("Can not connect to the WiFi.");
    while (true)
      ; // ничего не делать
  }
  Serial.println("OK, Connected to WiFi.");

  sendCommand("AT+CIPSTA?");
  //sendCommand("AT+CIPDNS_CUR?");
  sendCommand("AT+CIPSTAMAC?");

}

void loop() {

  temp_f = dht.readTemperature();
  humidity = dht.readHumidity();
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGGER_PIN, LOW);

  duration = pulseIn(ECHO_PIN, HIGH);
  distance = duration * 0.034 / 2;

  // подключаемся к серверу
  if (sendCommand("AT+CIPSTART=\"TCP\",\"gg.com\",80")) {
    Serial.println("connected to Cloud");

    // формируем HTTP-запрос
    getStr = "GET /upload.php?trash=";
    getStr += Trash;
    getStr += "&distance=";
    getStr += distance;
    getStr += "&temp_f=";
    getStr += temp_f;
    getStr += "&humidity=";
    getStr += humidity;
    getStr += " HTTP/1.1\r\n";
    getStr += "Host: gg.com\r\n\r\n";

    // открываем буфер отправки
    buff = "AT+CIPSEND=";
    buff += getStr.length();
    if (sendCommand(buff.c_str()) && Serial1.find(">")) { // прошивка АТ готова принимать данные

      // отправляем HTTP-запрос
      Serial.println(getStr);
      Serial1.print(getStr);

      // вывести HTTP-ответ
      if (Serial1.find("+IPD,")) { // получен ответ
        int l = Serial1.parseInt();
        while (l > 0) {
          if (Serial1.available()) {
            Serial.write(Serial1.read());
            l--;
          }
        }
        Serial.println("--------------");
      } else {
        Serial.println("no response");
      }
    } else {
      Serial.println("send error");
    }
    sendCommand("AT+CIPCLOSE");
  } else {
    Serial.println("Error connecting");
  }
}

bool connectWiFi() {

  if (!sendCommand("ATE0")) // эхо выключено
    return false;
  if (!sendCommand("AT+CIPMUX=0")) // установить режим одиночного соединения
    return false;
  if (!sendCommand("AT+CWMODE=1")) // установить режим STA
    return false;
  return sendCommand("AT+CWJAP=\"CAPSTONE\",\"capstonemis\"");
}

bool sendCommand(const char* cmd) {
  Serial.println(cmd);
  Serial1.println(cmd);
  while (true) {
    buff = Serial1.readStringUntil('\n');
    buff.trim();
    if (buff.length() > 0) {
      Serial.println(buff);
      if (buff == "OK" || buff == "SEND OK" || buff == "ALREADY CONNECTED")
        return true;
      if (buff == "ERROR" || buff == "FAIL" || buff == "SEND FAIL")
        return false;
    }
  }
}

код для firebase

<?php

require 'firebaseLib.php';
$Trash = $_GET["trash"];

$Distance = $_GET["distance"];
$Temperature = $_GET["temp_f"];
$Humidity= $_GET["humidity"];

// --- Это URL вашего Firebase
$baseURI = 'https://thesis1-69.firebaseio.com';
// --- Используйте здесь свой токен из Firebase
$token = 'gg';
// --- Вот ваш параметр из http GET



$devicestatus= array('Distance' => $Distance,'Temperature' => $Temperature,'Humidity' => $Humidity);

$firebasePath = '/thesis1-69/';




$full= array($Trash => $devicestatus);

/// --- Делая звонки
$fb = new Firebase($baseURI, $token);
$fb -> update($firebasePath, $full);


?>

любое руководство и помощь могут мне очень помочь спасибо большое :)

, 👍0

Обсуждение

это код из моего чата с Сяоми https://chat.stackexchange.com/rooms/85432/discussion-on-question-by-xiaomy-arduino-uno-with-esp8266-01-with-at, @Juraj

да я сяоми, @Mark Anthony Donadillo

@Juraj мы можем создать чат?, @Mark Anthony Donadillo

почему как новый пользователь?, @Juraj

Я не могу ответить на беседу и не могу опубликовать новый вопрос в недавней учетной записи., @Mark Anthony Donadillo

мы сделали ошибку в этом коде. изменить String buff (64); String getStr(128); to String buff; Строка getStr; и добавить buff.reserve(64); getStr.reserve(256); сначала в setup(), @Juraj

не нужно добавлять код на PHP?, @Mark Anthony Donadillo

это верно, сэр? недействительная установка () { buff.reserve(64); getStr.reserve(256); Серийный.начать(9600);, @Mark Anthony Donadillo

Я просто хочу изменить Wi-Fi через POST, поэтому я хочу использовать его. Я отправлю данные в firebase, затем их получит Arduino., @Mark Anthony Donadillo

доброе утро, сэр Спасибо, сэр можете ли вы предоставить мне пример получения информации обратно в arduino Я просто хочу изменить SSID и пароль arduino (esp-01) с помощью приложения это приложение использует firebase для отправки данных на веб-сервер обратно в arduino поэтому Wi-Fi будет изменен тогда не нужно вручную кодировать его с помощью arduino IDE, @Mark Anthony Donadillo

лучше вернуть новый ssid и пароль в ответ на существующий запрос, который отправляет данные сенсора. конечно, только если Wi-Fi должен переподключиться, @Juraj

поэтому я буду использовать POST?, @Mark Anthony Donadillo

Запрос POST отличается от запроса GET только одним: он может отправлять данные в «теле». как вы можете видеть в моем ответе, данные отправляются не в URL-адресе, а после заголовка запроса. формат ответа одинаков для GET и POST, @Juraj

ах извините за это спасибо за правильную идею, сэр :) но как я могу получить то, что я хочу?, @Mark Anthony Donadillo

так что это будет зависеть от кода arduino или firebase php?, @Mark Anthony Donadillo

сначала в php добавьте ответ, если ssid должен измениться. скетч Arduino в том виде, в каком он есть сейчас, печатает полученный ответ. тогда вы можете спросить, как его разобрать и обработать, @Juraj

так что, скорее всего, запрос GET тоже?, @Mark Anthony Donadillo

Я просто подумал сделать переменную, но я не знаю, как данные firebase будут получены веб-сервером, @Mark Anthony Donadillo

добавить ответ на запрос GET, который доставляет данные датчика, @Juraj

тот же формат с мусором?, @Mark Anthony Donadillo

запрос GET, который у вас есть, может вернуть новый ssid и пароль, @Juraj

Я установлю 2 переменные? Я не знаю, как я могу это сделать потому что запрос GET используется arduino для отправки данных с веб-сервера на firebase в приложение, @Mark Anthony Donadillo

а новый ssid надо брать откуда-то еще? не над страницей php?, @Juraj

приложение подключено к firebase поэтому firebase получит ssid и пароль устанавливается пользователем, использующим приложение, @Mark Anthony Donadillo

Я думаю, что страница php будет шлюзом между arduino и firebase, @Mark Anthony Donadillo

поэтому php-страница может вернуть новый ssid и пароль в ответ на запрос GET, полученный с данными датчика., @Juraj

да сэр Я думаю, @Mark Anthony Donadillo

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/94390/discussion-on-question-by-mark-anthony-donadillo-how-to-send-data-from-firebase) ., @VE7JRO


1 ответ


Лучший ответ:

0

добавить глобальную переменную String data; и в loop()

data = "trash=";
data += Trash;
data += "&distance=";
data += distance;
data += "&temp_f=";
data += temp_f;
data += "&humidity=";
data += humidity;

// формируем HTTP-запрос
getStr = "POST /upload.php HTTP/1.1\r\n";
getStr += "Content-type: application/x-www-form-urlencoded\r\n";
getStr += "Content-length: ";
getStr += data.length();
getStr += "\r\nHost: gg.com\r\n\r\n";
getStr += data;
,

Спасибо, сэр Итак, данные представляют собой SSID и пароль?, @Mark Anthony Donadillo

Я хочу сохранить как GET, так и POST, @Mark Anthony Donadillo

например Я установлю переменную, а именно data1 и data2 затем на return sendCommand("AT+CWJAP=\"CAPSTONE\",\"capstonemis\""); } будет заменен return sendCommand("AT+CWJAP=\"data1\",\"data2\""); } это верно, сэр?, @Mark Anthony Donadillo

Мне не нужно добавлять PHP-код на сервер веб-сайта?, @Mark Anthony Donadillo

поэтому вы хотите «получить» данные. почему вы хотите сделать это с запросом «пост»?, @Juraj

ах, для получения данных с firebase/веб-сервера не нужен запрос «post»? У меня неправильное представление об использовании «post» Я думал, что это для передачи данных из firebase в arduino Я изменю Wi-Fi Arduino (esp8266-01) с помощью приложения. это приложение отправляет данные в firebase, затем оно отправит данные (SSID и пароль) в arduino, @Mark Anthony Donadillo