[Erledigt]Lüftersteuerung mit Nano und OLED Display

Hallo zusammen, ich habe mich hier angemeldet weil ich neuling auf diesem gebiet bin. Bis auf die Firmware von meinen 3D Druckern habe ich noch nicht viel gemacht.

Mein problem ist ich habe eine Umluftanlage gebaut wo ich mit einem Arduino Nano die Temperatur abfrage und einen Lüfter einschalte.
Dieser soll mit steigender Temperatur per PWM immer schneller laufen.

Ein Display um die Temperatur und die Geschwindigkeit anzeigen zu lassen ist auch mit dabei. Es ist ein OLED 0,9 zoll Display und ein DHT 22 Temperaturfühler.

Ich habe mir einen Code im Internet gesucht der passt nur leider läuft er nicht. Das Display bleibt dunkel und der Serielle Monitor zeigt mir auch nur 0 grad an. Wende mich an euch weil ich nicht weiß was ich anpassen muss. Es sind 12 Volt lüfter über Mosfets geschalten.

Mfg Tomtom86

:warning:
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Willkommen in Forum.
Meine Glaskugel ist Defekt, stell doch dein Code rein.
Aber bitte in Code Task wie das geht steht hier

Dann solltest du auch dein Schaltbild posten. Daran können wir evtl. auch sehen was du falsch machst.

Hallo werde ich morgen abend machen. Habe schon selber versucht aber es ist immer noch nicht so wie sein soll. Mache morgen mal ne kleine skize und lade den code hoch. Mdf

So anbei mein Code den ich aus dem Internet habe.

/* Temperature Based Fan Speed Controller and Monitoring using Arduino
   WWW.Electroduino.com  */
//OLED Display libraries
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128    // OLED display width, in pixels
#define SCREEN_HEIGHT 64    // OLED display height, in pixels
#define OLED_RESET 4

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


#include <dht.h>    // Include DHT11 library
#define DATApin 12  // Defines Arduino pin which is connected to the sensor
dht DHT;            // Creates a DHT object

int Fan = 3;       // Fan is connect to Arduino Pin D3 (PWM)
int GreenLed = 10;  // Green LED is connect to Arduino Pin
int RedLed = 9;     // Red LED is connect to Arduino Pin D9

int TempMin = 25;   // the temperature to start the fan 0%
int TempMax = 50;   // the maximum temperature when fan is at 100%
int FanSpeed;
int fanLCD;

void setup()
{
  //Sets the baud for serial data transmission between Arduino and your computer
  Serial.begin(9600);

  //initialize with the I2C addr 0x3C (128x64)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  delay(10);

  pinMode(Fan, OUTPUT);
  pinMode(RedLed, OUTPUT);   // initialize digital pin RedLed as an output.
  pinMode(GreenLed, OUTPUT); // initialize digital pin GreenLed as an output.

  // Print text on display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(25, 0);
  display.println("ELECTRODUIN0"); // Print text
  display.setCursor(10, 20);
  display.println("Temperature Based");
  display.setCursor(3, 35);
  display.println("Fan Speed Controller");
  display.display();
  delay(2000);
}

void loop()
{
  // Read data from Sensor
  int readData = DHT.read11(DATApin);
  int Temp = DHT.temperature;  // Read Temperature in Degree Celsius unit

  //Print Tempareture Value on Serial Monitor Window
  Serial.print("Temperature = ");
  Serial.print(Temp);  // Temperature value in Degree Celsius
  Serial.println("°C");

  if (Temp < TempMin)    // if Temp is lower than TempMin
  {
    FanSpeed = 0;      // fan is not spinning
    analogWrite(Fan, FanSpeed);
    fanLCD = 0;
    digitalWrite(Fan, LOW);      // fan is not spinning
    digitalWrite(GreenLed, LOW); // turn off Green LED
  }

  // if Temperature is higher than TempMin and lower than TempMax
  if ((Temp >= TempMin) && (Temp <= TempMax))
  {
    FanSpeed = Temp;//map(Temp, tempMin, tempMax, 0, 100); // the actual speed of fan//map(temp, tempMin, tempMax, 32, 255);
    FanSpeed = 1.5 * FanSpeed;
    fanLCD = map(Temp, TempMin, TempMax, 0, 100);  // fan speed Show on display
    analogWrite(Fan, FanSpeed);   // spin the fan at the fanSpeed speed
    digitalWrite(GreenLed, HIGH);  // turn on Green LED
    delay(1000);
  }

  // if Temp is higher than TempMax
  if (Temp > TempMax)
  {
    digitalWrite(RedLed, HIGH);  // turn on Red LED
    digitalWrite(GreenLed, LOW); // turn off Green LED
  }
  else
  {
    digitalWrite(RedLed, LOW); // turn off Red LED
  }
  // Print text on display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("ELECTRODUINO"); // Print text
  display.setTextSize(2);
  display.setCursor(0, 20);
  // Print Temperature
  display.println("Temp:");
  display.setCursor(60, 20);
  display.println(Temp);  // Temperature Value
  display.setCursor(95, 20);
  display.println((char)247);
  display.setCursor(110, 20);
  display.println("C");
  // Print Fan Speen
  display.setCursor(0, 40);
  display.println("FANS:");
  display.setCursor(60, 40);
  display.println(fanLCD); // Fan Speed Value
  display.setCursor(110, 40);
  display.println("%");
  display.display();
  delay(2000); // wait two seconds
}

Hier die Zeichnung wie ich es angeschlossen habe.

Mein Display ist von Amazone:
AptoFun 0.96" Inch I2c IIC Serial 128x64 OLED LCD OLED LED Module für Arduino Display 51 Msp420 Stim32 SCR https://amzn.eu/d/cE5sNPj

Der Anschluss des Lüfters an D3 stimmt nicht, denn es wird an A3 analog ausgegeben.
Die Adresse des OLed Displays ist mit 0x3C im Code. Das Display welches du hast hat auf der Rückseite eine Beschriftung mit der Adresse. Dort wo die Lötbrücke oder der Widerstand verlötet wurde ist deine Adresse. Auf dem Foto von Amazon sieht man 0x7B.

Meine Displays laufen alle mit 3.3V Versorgung, bitte auch das ändern. Ausserdem ist das Temp. Modul verpolt angeschlossen.

Ich habe so ein Display auch mit 5V in Betrieb, das läuft ohne Probleme. Es gibt normalerweise zwei Versionen, solche mit 3.3V und solche mit 5V.

D3 ist kein PWM PIN. Normal gehen nur die PWM-Pins 3, 5, 6, 9, 10, 11, also D3 ändern.
Display Adresse ändern auf 0x7B wen nicht Funktioniert ist ein SH1106 auf dem Display. Ich wurde die U8g2 nehmen und mit U8x8lib.h
den ansteuern.
Um sicher zu sein nehme ein I2C Scanner dann wird dir die richtige Adresse angezeigt, manchmal sind die Angaben auf dem Display falsch

Zu dem Tempsensor dieser läuft mit einem anderen Code. Ist also zumindest an meinem arduino richtig angeschlossen mit datapin auf 12.

Wenn ich eine Andere Bibliothek nehme für das display was muss ich da alles ändern? Bin wie gesagt neu auf dem gebiet und mache das programieren nicht so oft.

Wie soll ich das verstehen mit D3 geht nicht. Ihr habt aufgezählt 3,5,6,9,10,11 sind doch eigentlich die pins auf dem Arduino mit D beschriftet, oder liege ich falsch? Mfg

Irrtum meinerseits :woozy_face:
D3 ist richtig habe das als D1 vertauscht Sorry

Alles klar also sollte das passen. Werde ich heute abend mal die adresse vom Display ändern und mal schauen was passiert. Hatte gestern auch noch einen Fehler das er die Bibilothek von SSD1306.h nicht findet obwohl sie da ist. Hoffe das klappt.

Wen das Display mit den 2 Adressen nicht will I2C Scanner benutzen

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(3000);           // wait 5 seconds for next scan
}

Wie oben erwähnt, ist die Ausgabe der Lüfterspannung auf A3, da mit analog.write ausgegeben wird. Das solltest du dann auch noch ändern, sonst läuft dein Lüfter nicht...

Die Bibliothek des Displays verwende ich auch. Funktioniert eigentlich ganz gut für solche Zwecke.

Ok mache ich. Ist sonnst noch etwas zu finden? Vieleicht kann ja mal jemand testen ob der code soweit läuft. Komme leider erst heute abend zum testen.

Habe ich eben gesehen im Code, deswegen dreht der lüfter nicht ist ja auch kein PWM. Muss ich also in digitalWrite umändern wenn ich das richtig verstanden habe.

Welche Bibilothek meinst du? Die SSD1306 oder die U8g2 :wink: