Arduino Polska Forum

Pełna wersja: Problem z połączeniem Uno i esp32 do blynk
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

Tworzę projekt który ma za zadanie zbierać dane z czujników BME280 i SGP30 po czym wyświetlać zebrane dane na wyświetlaczu i wysyłać poprzez UART dane do modułu ESP32 który wysyła je do aplikacji Blynk i wyświetla. Problem polega na połączeniu prawdopodobnie między arduino a ESP32 ponieważ przy braku komunikacji między nimi kod wgrywa się natomiast jeśli podłącze piny RX i TX żeby arduino pracowało jako master a ESP32 jako slave wyrzuca błąd:

A fatal error occurred: Failed to connect to ESP32: Download mode successfully detected, but getting no sync reply: The serial TX path seems to be down.
For troubleshooting steps visit: https://docs.espressif.com/projects/espt...oting.html
Failed uploading: uploading error: exit status 2


Dodam że moduł niepodłączony po wgraniu programu startowego Blynk łączy się prawidłowo natomiast z arduino nie chce współpracować i pobierać danych.

Kod wgrany do ESP32
Kod:
#define BLYNK_TEMPLATE_ID           "TMPL4z6EtDmun"
#define BLYNK_TEMPLATE_NAME         "Quickstart Template"
#define BLYNK_AUTH_TOKEN            "8W_VxNM6iQo0FYvVmb9B0DtGZzdw9vvL"

#define BLYNK_PRINT Serial

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Adafruit_SGP30.h"
#include <LiquidCrystal_PCF8574.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

#define SEALEVELPRESSURE_HPA (1013.25)

char ssid[] = "HUAWEI-A642";
char pass[] = "3892DMHN5DF";

Adafruit_BME280 bme;
Adafruit_SGP30 sgp;

LiquidCrystal_PCF8574 lcd(0x27);

BlynkTimer timer;

void myTimerEvent() {
  float temperature = bme.readTemperature();
  float humidity = bme.readHumidity();
  float pressure = bme.readPressure() / 100.0F;

  if (!isnan(temperature) && !isnan(humidity) && !isnan(pressure)) {
    Serial.print("Temperature = ");
    Serial.print(temperature);
    Serial.println(" *C");

    Serial.print("Humidity = ");
    Serial.print(humidity);
    Serial.println(" %");

    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" hPa");

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(temperature);
    lcd.print("C");

    lcd.setCursor(0, 1);
    lcd.print("Humidity: ");
    lcd.print(humidity);
    lcd.print("%");

    lcd.setCursor(0, 2);
    lcd.print("Pressure: ");
    lcd.print(pressure);
    lcd.print("hPa");

    Blynk.virtualWrite(V0, temperature);
    Blynk.virtualWrite(V1, humidity);
    Blynk.virtualWrite(V2, pressure);
  }

  if (sgp.IAQmeasure()) {
    Serial.print("eCO2: ");
    Serial.print(sgp.eCO2);
    Serial.print(" ppm\tTVOC: ");
    Serial.print(sgp.TVOC);
    Serial.println(" ppb");

    lcd.setCursor(0, 3);
    lcd.print("eCO2: ");
    lcd.print(sgp.eCO2);
    lcd.print(" ppm");

    lcd.setCursor(12, 3);
    lcd.print("TVOC: ");
    lcd.print(sgp.TVOC);
    lcd.print(" ppb");

    Blynk.virtualWrite(V3, sgp.eCO2);
    Blynk.virtualWrite(V4, sgp.TVOC);
  }

  // Wysyłanie danych do Arduino UNO przez UART
  Serial.print("T:");
  Serial.print(temperature);
  Serial.print(" H:");
  Serial.print(humidity);
  Serial.print(" P:");
  Serial.print(pressure);
  Serial.print(" eCO2:");
  Serial.print(sgp.eCO2);
  Serial.print(" TVOC:");
  Serial.print(sgp.TVOC);
  Serial.println();
}

void setup() {
  Serial.begin(115200);
  while (!Serial);

  Serial.println("Starting...");

  Blynk.config(BLYNK_AUTH_TOKEN);
  WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to WiFi");

  if (!bme.begin(0x76)) {
    Serial.println("Could not find BME280 sensor, check wiring!");
    while (1);
  }

  if (!sgp.begin()){
    Serial.println("Could not find SGP30 sensor, check wiring!");
    while (1);
  }

  lcd.begin(20, 4);
  lcd.setBacklight(255);

  lcd.setCursor(0, 0);
  lcd.print("BME280 & SGP30");
  delay(2000);

  timer.setInterval(1000L, myTimerEvent);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    Blynk.run();
  } else {
    Serial.println("WiFi disconnected, trying to reconnect...");
    WiFi.begin(ssid, pass);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("\nReconnected to WiFi");
  }
  timer.run();
}


Kod wgrany do Arduino
Kod:
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "Adafruit_SGP30.h"
#include <LiquidCrystal_PCF8574.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;
Adafruit_SGP30 sgp;

LiquidCrystal_PCF8574 lcd(0x27);

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!bme.begin(0x76)) {
    Serial.println("Could not find BME280 sensor, check wiring!");
    while (1);
  }

  if (!sgp.begin()){
    Serial.println("Could not find SGP30 sensor, check wiring!");
    while (1);
  }

  lcd.begin(20, 4);
  lcd.setBacklight(255);

  lcd.setCursor(0,0);
  lcd.print("BME280 & SGP30");
  delay(2000);
}

void loop() {
  float temperature = bme.readTemperature();
  float humidity = bme.readHumidity();
  float pressure = bme.readPressure() / 100.0F;

  if (!isnan(temperature) && !isnan(humidity) && !isnan(pressure)) {
    Serial.print("T:");
    Serial.print(temperature);
    Serial.print(",H:");
    Serial.print(humidity);
    Serial.print(",P:");
    Serial.print(pressure);
    Serial.print(",");

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(temperature);
    lcd.print("C");

    lcd.setCursor(0, 1);
    lcd.print("Humidity: ");
    lcd.print(humidity);
    lcd.print("%");

    lcd.setCursor(0, 2);
    lcd.print("Pressure: ");
    lcd.print(pressure);
    lcd.print("hPa");
  }

  if (sgp.IAQmeasure()) {
    Serial.print("eCO2:");
    Serial.print(sgp.eCO2);
    Serial.print(",TVOC:");
    Serial.print(sgp.TVOC);
    Serial.println();

    lcd.setCursor(0, 3);
    lcd.print("eCO2: ");
    lcd.print(sgp.eCO2);
    lcd.print(" ppm");

    lcd.setCursor(12, 3);
    lcd.print("TVOC: ");
    lcd.print(sgp.TVOC);
    lcd.print(" ppb");
  }

  delay(1000);
}
Jeśli masz problem z wgraniem do flash to dlatego, że w ESP32 i Arduino UNO UART/Serial jest używany do wgrywania programu do flash. W ESP32 można jeszcze użyć innego UART, w UNO na czas wgrywania programu trzeba rozłączać piny do UART, można też użyć softserial na innym pinie. No i ESP32 działa na 3.3V, UNO na 5V, nie napisałeś nic o konwersji napięć, brak może uszkodzić ESP32.
Poza tym ustawiasz prędkość UART w ESP32 115200, a w UNO 9600, jak to ma ze sobą gadać to musi być tak samo.
Nie można też używać tego samego Serial do wysyłania danych dla monitora UART w PC przez USB i przez połączenie UART między uC, połączenie UART jest 1:1, a na płytkach ono jest już podłączone do konwerterów UART-USB, od biedy to zadziała prawek kaduka, bo do konwertera jest podłączone przez rezystor.