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.
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.
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
/* 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
}
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.
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
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.
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.