Skocz do zawartości

Xiao ESP32-C3 nie znajduje czujnika BME280


shekuu

Pomocna odpowiedź

Razem z Chatem GPT postanowiłem napisać program, który będzie wyświetlał godzinę, temperaturę, wilgotność powietrza i ciśnienie. Jednak napotkałem problem, na który Pan Sztuczna Inteligencja nie jest w stanie mi udzielić odpowiedzi mimo długich rozmów😆.  Użyłem Seedino Xiao ESP32C3, czujnika BME280 oraz wyświetlacza OLED 128x32.


W ten sposób powstał taki kod:


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <time.h>

// Replace with your network credentials
const char* ssid = "supernazwa123";
const char* password = "megahaslo123";

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 60000); // Update every minute

// Create BME280 object
Adafruit_BME280 bme; // I2C

// Create SSD1306 display object
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  delay(2000); // Poczekaj na otwarcie Serial Monitora
  Serial.println("Starting setup...");

  // Inicjalizacja komunikacji I2C
  Wire.begin(6, 7); // GPIO6 (SDA), GPIO7 (SCL)

  // Initialize SSD1306 display
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  Serial.println("OLED initialized");

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.print(F("Starting..."));
  display.display();
  delay(2000); // Pauza na włączenie wyświetlacza

  display.clearDisplay();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Initialize time client
  timeClient.begin();
  Serial.println("NTP client initialized");

  // Initialize BME280 with a specific I2C address
  if (!bme.begin(0x76)) { // Zmień na 0x77 jeśli konieczne
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  Serial.println("BME280 initialized");
}

void loop() {
  // Update the time client
  timeClient.update();
  Serial.println("Time client updated");
  
  // Get temperature, pressure and humidity from BME280
  float temperature = bme.readTemperature();
  float pressure = bme.readPressure() / 100.0F; // Convert to hPa
  float humidity = bme.readHumidity();
  Serial.println("BME280 data read");

  // Get current time
  unsigned long epochTime = timeClient.getEpochTime();
  struct tm *ptm = gmtime((time_t *)&epochTime);
  int day = ptm->tm_mday;
  int month = ptm->tm_mon + 1;
  int year = ptm->tm_year + 1900;
  String formattedDate = String(day) + "-" + String(month) + "-" + String(year);
  String formattedTime = timeClient.getFormattedTime();
  Serial.println("Time data formatted");

  // Display data on OLED
  display.clearDisplay();
  
  display.setCursor(0, 0);
  display.print("Time: ");
  display.println(formattedTime);
  Serial.print("Time: ");
  Serial.println(formattedTime);
  
  display.setCursor(0, 10);
  display.print("Date: ");
  display.println(formattedDate);
  Serial.print("Date: ");
  Serial.println(formattedDate);
  
  display.setCursor(0, 20);
  display.print("Temp: ");
  display.print(temperature);
  display.println(" C");
  Serial.print("Temp: ");
  Serial.print(temperature);
  Serial.println(" C");
  
  display.setCursor(0, 30);
  display.print("Press: ");
  display.print(pressure);
  display.println(" hPa");
  Serial.print("Press: ");
  Serial.print(pressure);
  Serial.println(" hPa");

  display.setCursor(0, 40);
  display.print("Humidity: ");
  display.print(humidity);
  display.println(" %");
  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.println(" %");
  
  display.display();
  Serial.println("Data displayed on OLED");
  
  // Wait a bit before updating again
  delay(10000); // Update every 10 seconds
}

 

Ale kiedy program dochodzi do momentu inicjalizacji czujnika BME280 wywala się i go nie znajduje. Sprawdzałem połączenia przewodów, wgrałem prostszy program i on działa bez zarzutów. Wszystko się dobrze wyświetla. 

//wyświetlanie temperatury, ciśnienia i wilgotności

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Definicje wyświetlacza OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // Adres I2C dla SSD1306

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Inicjalizacja czujnika BME280
Adafruit_BME280 bme; // I2C

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

  // Inicjalizacja komunikacji I2C
  Wire.begin(6, 7); // GPIO6 (SDA), GPIO7 (SCL)

  // Inicjalizacja wyświetlacza OLED
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }

  // Wyczyszczenie wyświetlacza, aby usunąć logo Adafruit
  display.clearDisplay();
  display.display();
  delay(2000); // Pauza na włączenie wyświetlacza

  // Inicjalizacja czujnika BME280
  if (!bme.begin(0x76)) { // Adres I2C dla BME280 (może być 0x77)
    Serial.println(F("BME280 not found"));
    for (;;);
  }

  // Przykładowe wyświetlenie tekstu na OLED
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print(F("BME280 & OLED Test"));
  display.display();
  delay(2000);
  display.clearDisplay();
}

void loop() {
  // Odczyt wartości z czujnika BME280
  float temperature = bme.readTemperature();
  float pressure = bme.readPressure() / 100.0F;
  float humidity = bme.readHumidity();

  // Wyświetlenie wartości na OLED
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print(F("Temp: "));
  display.print(temperature);
  display.println(F(" *C"));

  display.print(F("Pressure: "));
  display.print(pressure);
  display.println(F(" hPa"));

  display.print(F("Humidity: "));
  display.print(humidity);
  display.println(F(" %"));

  display.display();
  delay(10000); // Aktualizacja co 10 sekunda
}


Jestem świerzakiem w tego typu sprawach i nie znam się na programowaniu. Jednak zaciekawiło mnie, dlaczego się tak dzieje. Fragmenty obu kodów, kiedy następuje inicjalizacja czujnika są takie same, więc teoretycznie powinno pójść gładko. 

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.