• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 + arduino komunikacja przez port szeregowy
#1
Witam.
Mam następujący problem
Póbuję przesłać dane z arduino do esp8266 przez port szeregowy. Niestety esp nie odczytuje danych. Port szeregowy softwarowy na pinach 3 i 4 esp (Rx,Tx). Hardwerowy ma te dane w celach kontrolnych przesłać do portu szeregowego na komputer. Dane pochodzą z czujniika dht11 podłączonego do arduino. Początkowo pin Tx z arduino podłączyłem do pinu 3 przez  konwerter napięć z 5 v na 3,3 v była też próba przez dzielnik napięcia. Brak jakiego kolwiek odzczytu. Na pinie Tx z arduino po przyłożeniu voltomierza widniej wynik około 4,98V~`5V.

kod arduino:
#include <DHT.h>

#define DHTPIN 2    // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11  // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  delay(10);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" °C, Humidity: ");
  Serial.print(h);
  Serial.println(" %");
 
  Serial.print("Sending data to ESP8266: ");
  Serial.print(t);
  Serial.print(",");
  Serial.println(h);
 
  delay(5000); // Wait 5 seconds before sending next reading
}


kod wgrany do esp (nie mojego autorstwa):

#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>

SoftwareSerial arduinoSerial(3, 4); // RX, TX

const char* ssid = "ssid";
const char* password = "password";
const char* server = "api.thingspeak.com";
const char* apiKey = "your_APIKEY";

WiFiClient client;

void setup() {
  Serial.begin(9600);
  arduinoSerial.begin(9600);
  delay(10);
while (WiFi.status() != WL_CONNECTED) {

  WiFi.begin(ssid, password);
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");
}

void loop() {
  if (arduinoSerial.available()) {
    String data = arduinoSerial.readStringUntil('\n');
    Serial.print("Received data from Arduino: ");
    Serial.println(data);

    int commaIndex = data.indexOf(',');
    if (commaIndex != -1) {
      String t = data.substring(0, commaIndex);
      String h = data.substring(commaIndex + 1);

      String url = "/update?api_key=";
      url += apiKey;
      url += "&field1=";
      url += t;
      url += "&field2=";
      url += h;
      url += "\r\n";

      if (client.connect(server, 80)) {
        client.print("GET ");
        client.print(url);
        client.println("HTTP/1.1");
        client.print("Host: ");
        client.println(server);
        client.println("Connection: close");
        client.println();
        client.stop();
      }
    }
  }
}


Celem całego projeku jest przesłanie tych danych na stronę thingspeak po dodaniu wiekszej liczby czujników.
Proszę o podanie możliwej przyczyny nie przesyłania danych.
 
Odpowiedź
#2
Kod:
const char* ssid = "";
const char* password = "";
const char* server = "";
const char* apiKey = ""
Nie pisz tu żadnych haseł i danych konfiguracyjnych. Dla własnego bezpieczeństwa!

A teraz odnośnie transmisji:
Kod:
  if (arduinoSerial.available()) {
    String data = arduinoSerial.readStringUntil('\n');
    Serial.print("Received data from Arduino: ");
    Serial.println(data);
Takie coś masz w pętli głównej i ten if ciągnie się przez cały loop.

Skoro nic się w programie nie dzieje, znaczy to, że arduino.Serial.available() == 0. Czyli dane nie dochodzą do ESP.
Skoro dane nie dochodzą do ESP to możemy jedynie wróżyć, co jest przyczyną...


Kod:
if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
}
po co Ci coś takiego, skoro ESP32 i tak takiej wiadomości nie obrobi...

Kod:
Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" °C, Humidity: ");
  Serial.print(h);
  Serial.println(" %");
To również jest zbędne, może powodować błędną interpretację danych po drugiej stronie.

- W przypadku połączenia Arduino <-> ESP potrzebny jest konwerter poziomu napięć.
- Podłączasz RX z Arduino z TX z ESP i druga linia TX -> RX.
- Bardzo ważne jest połączenie mas obydwu urządzeń.
- W przypadku wątpliwości działania spróbuj na prostym kodzie, gdzie ESP odbiera i przesyła do kompa w niezmienionej postaci.

A tak w ogóle to po co w to mieszać Arduino? Nie lepiej jakieś NodeMCU?
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości