Probleme mit ISP/ I2C und seriellem Display am Nano

Hallo,

ich frage hier für meinen Neffen der sich mit einem Nano gerade eine Wetterstation baut und ein Problem hat.

Er verwendet folgende Hardware:

  • Nano Clone
  • BME 280 am I2C
  • RTC am I2C
  • Liquid Crystal (Seriell angeschlossen)
  • SD Speichermodul am ISP

Problem ist, dass jedes Modul für sich funktioniert. Auch die Kombination Nano/BME/LQ funktioniert. Ab dem Moment wo das SD Modul dazu kommt beginnen die Probleme. Mit unserem Code funktioniert die Speicherung des Datensatz aber im Display stehen entweder ganz viele “fffff” oder das Display bleibt leer.
Wir haben das SD Modul an den ISP Header angeschlossen das MISO und MOSI am normalen Header bereits für den I2C benutzt wird. Liegt da unser Problem? Gibt es eine Lösung die funktioniert?

Hier der Code:

#include <Wire.h>
#include "BlueDot_BME280.h"
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>
BlueDot_BME280 bme280 = BlueDot_BME280();

const int rs = 12, en = 11, d4 = 5, d5 = 10, d6 = 3, d7 = 2;
const int chipSelect = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    while (1);
  }
  Serial.println("card initialized.");

  Serial.println(F("Basic Weather Station"));

  bme280.parameter.communication = 0;
  bme280.parameter.I2CAddress = 0x76;
  bme280.parameter.sensorMode = 0b11;
  bme280.parameter.IIRfilter = 0b100;
  bme280.parameter.humidOversampling = 0b101;
  bme280.parameter.tempOversampling = 0b101;
  bme280.parameter.pressOversampling = 0b101;

  bme280.parameter.pressureSeaLevel = 1013.25;
  bme280.parameter.tempOutsideCelsius = 15;

  if (bme280.init() != 0x60)
  {
    while (1);
  }

  else
  {
    Serial.println(F("BME280 detected!"));
  }
}


void loop() {
  {
    float p = bme280.readPressure() + 56.2;
    float t = bme280.readTempC();
    int h = bme280.readHumidity();

    Serial.print(F("Temperature in Celsius:\t\t"));
    Serial.println(t);

    Serial.print(F("Humidity in %:\t\t\t"));
    Serial.println(h);

    Serial.print(F("Pressure in hPa:\t\t"));
    Serial.println(p);

    Serial.println();
    Serial.println();

    lcd.setCursor(0, 0);
    lcd.print(F("Temp.:"));
    lcd.print(t);
    lcd.setCursor(0, 1);
    lcd.print(F("Luftf.:"));
    lcd.print(h);
    delay(5000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Temp.:"));
    lcd.print(t);
    lcd.setCursor(0, 1);
    lcd.print(F("Luftdr.:"));
    lcd.print(p);
    delay(5000);
    lcd.clear();


    File dataFile = SD.open("datalog.txt", FILE_WRITE);

    dataFile.print(t);
    dataFile.print(",");
    dataFile.print(h);
    dataFile.print(",");
    dataFile.println(p);
    dataFile.close();
  }

}

das MISO und MOSI am normalen Header bereits für den I2C benutzt wird.

Völlig unlogisch!
I2C liegt auf A4 und A5

Liegt da unser Problem?

Ja!
Zumindest eins.

Kommando zurück.
D11 und D12 waren durch das Display belegt. Dadurch waren dort Mosi und Miso belegt.

Das Problem liegt wohl am Display. Das wird nicht seriell angesteuert, sondern parallel.
Da werden auch Pins genutzt, die ebenso SPI nutzt.
Warum verwendet ihr nicht eine Display mit I2C-Schnittstelle, damit seit ihr das Problem los.

Wir würden es gerne mit den vorhandenen Equipment schaffen. Also müsste ich die parallelen Anschlüsse am Nano so umlegen, das der ISP nicht gestört wird?

michaelkies:
Kommando zurück.
D11 und D12 waren durch das Display belegt. Dadurch waren dort Mosi und Miso belegt.

Auch das ist unlogisch!

Denn SPI requiriert die Pins für sich.
Eine Doppelnutzung mit dem parallel Display ist nicht möglich.

Tipp:
Verwende ein SPI oder I2C Display.

Also müsste ich die parallelen Anschlüsse am Nano so umlegen, das der ISP nicht gestört wird?

Das wäre zur Abwechslung mal logisch.

Da ich vermute, ihr verwendet ein übliches LCD mit 2 oder 4 Zeilen, könnt ihr das mit diesem Adapter auf I2C erweitern.

  • BME 280 am I2C // A4/A5 (18/19)
  • RTC am I2C // A4/A5 (18/19)
  • Liquid Crystal (Seriell angeschlossen) // falsch! 12/11/10/5/3/2
  • SD Speichermodul am ISP // 13/12/11/4

Doppelt belegt: 11/12
Frei: 6,7,8,9,14,15,16,17 zs. A6,A7

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.