|
<<<<<<<<<<<<<<<<<<<<<<< arduino
Kleinprojekte >>>>>>>>>>>>>>>>>>>>>>>>>
Das ist der Arduino! Ein I/O Board mit
Microcontroller und analogen und digitalen Ein- und Ausgängen.
Die Programmierung selbst erfolgt in C bzw. C++
<<< dies ist ein Arduino UNO
Mit der Microcontroller-Platine arduino UNO R3 kann man
unendlich viele elektronisch gesteuerte Projekte mit kleinstem finanziellem
Aufwand entwickeln. Dazu muß man die Microcontroller-Platine üblicher
Weise in C++
programmieren. Viele Projekte kann man mit den Arduino- Starterkits ohne löten
zu müssen zusammenstellen.
Die Enwicklungsumgebung für den PC,
(programmieren, geschriebenes Programm kompilieren und über USB-Kabel auf den
arduino übertragen)
ist kostenlos erhältlich
bei den arduino-Entwicklern: http://arduino.cc/
Es gibt arduino- Einsteiger-Kits, mit denen man spielerisch in
die Programmierung einsteigen kann.
Ich habe mit dem VILROS-Kit den ganzen Spaß angefangen, der mich nicht mehr los
läßt.
Ich habe ein paar Versuchs-Projekte damit zusammengebaut:
>> hier geht es zum
Campari-Kühler
1. Zeit/Datum/Temperatur/Luftfeuchtigkeit Test-Kästchen
Phase I: Einbau in Plastik-Kästchen:
Phase II
Einbau in Holzkästchen:

2. Meßgerät (als
Arduino-Bausatz)
Messen kann man damit:
Transistoren mit Selbsterkennung der
C-B-E Anschlüsse!
Dioden
Widerstände
Kapazitäten
Induktivitäten
<< eingebaut in ein Holz-Kästchen
Und nun, eingebaut in eine Kunststoff-Box:

und anstelle der 9 V Batterie habe ich ein 230 V - 12 V DC-
Netzteil, 450 mA eingebaut mit den Maßen: 3 x 2 x 1,8 cm; das komplette Netzteil
incl. Trafo ist also kleiner als eine 9 V Batterie. (aliexpress .com - 2,25 Euro
incl. Versand):
<<
Netzteil 230 V AC auf 12 V DC (450 mA), kleiner als eine 9 V Batterie!
<< Netzteil eingebaut
Wichtige Info: Netzteil wieder ausgebaut, da zu
viele Störungen die Messungen verschlechterten/verhinderten. 9V-Akku oder
externes Netzteil wieder im Einsatz.
3. Testweiser Versuch (nur zum Programmierenlernen): Ein
"ausgeschlachtetes" CD- Laufwerk mit Hilfe des arduino in bestimmtem Rhythmus ein und ausfahren lassen.

4. Mit GPS-Sensor: Anzeige über LCD-Display:
1. X- Y-
Koordinaten in °Nord und ° West,
2. Höhe über dem Meer,
3. Anzahl der Empfangs-Satelliten,
4. Helligkeit (Lux),
5. UV-Intensitätsmesser
und
6. Temperatursensor
7. Anzeige über ein 6-zeiliges Nokia-LCD-Display
Testaufbau:
5. Roboter

6. Test Solarpanel-Nachführung
(für ausschlacht Panels von z.B. defekten Gartenleuchten) mit
2 Servos für die horizontalen und vertikalen Bewegungen.
Phase I:
Ansteuerung der 2 Servos mit
überschlägig berechnetem Sonnenverlauf.

Phase II:
mit Nachführung aufgrund unterschiedlicher
Helligkeiten mit 4 LDRs (lichtabhängige Sensoren).
Arduino steuert die Servos so, daß alle 4 LDR´s die maximale
Helligkeit erreichen. Damit werden die Sonnen Kollektoren automatisch der Sonne
nachgeführt.


Der einfache Test-Sketch für diese Sonnen-Nachführung:
/* Servo_und LDR_16
2 Servos ohne Motor-shield
4 LDR-Sensoren
Servo horizontal = Pin digital 10
Servo vertikal = Pin digital 11
LDR Light Dependent Resistor 5MM Fotowiderstand
LDR analog 0 oli =grün (oben links)
LDR analog 1 ore =blau (obenrechts)
LDR analog 2 uli=gelb (unten links)
LDR analog 3 ure=orange (unten rechts)
*/
#include <Servo.h>
Servo shori; // Servo horizontal - 0=rechts; 180=links
Servo sverti;//Servo vertikal - 0=oben; 180=unten
// LDR-Sensoren:
int LDRoli = 0;
int LDRore = 1;
int LDRuli = 2;
int LDRure = 3;
int Loli, Lore, Luli, Lure;
int istoli, istore, istuli, isture;
int ist_horizontal, ist_vertikal;
int winkel=2;// Winkeldifferenz zur Nachführung
void setup()
{
shori.attach(10); // Servo horizontal definieren
sverti.attach(11); // Servo vertikal definieren
shori.write(90); // horizontal ausrichten
sverti.write(90); // nach vorne ausrichten
Serial.begin(9600);
Serial.print("Servo_und LDR_16");
}
void loop()
{
ist_horizontal=shori.read();
ist_vertikal=sverti.read();
Loli = analogRead(LDRoli);
Lore = analogRead(LDRore);
Luli = analogRead(LDRuli);
Lure = analogRead(LDRure);
// horizontal ausrichten:
if ((Loli+Luli)>(Lore+Lure)) // linke 2 LDRs heller als rechte, also nach links
drehen
{
shori.write(ist_horizontal+winkel);
}
if ((Loli+Luli)<(Lore+Lure)) // linke 2 LDRs dunkler als rechte, also rechts
drehen
{
shori.write(ist_horizontal-winkel);
}
// vertikal ausrichten:
if ((Loli+Lore)>(Luli+Lure)) // obere 2 LDRs heller als untere, also nach oben
drehen
{
sverti.write(ist_vertikal-winkel);
}
if ((Loli+Lore)<(Luli+Lure)) // untere 2 LDRs heller als untere, also n. unten
drehen
{
sverti.write(ist_vertikal+winkel);
}
delay(500);
}
7. Test Schrittmotor mit Stepper-Motor
28BYJ-48 und L293D
Motorshield und Laser-Ansteuerung

8. Temperatur und Feuchtigkeits Messer mit DHT22
Temperatur-Sensor mit einer Genauigkeit von +/- 0,5 °
Anzeige mit Nokia Grafik-Display 5110.
Laufende Anzeige von
* aktuelle Temperatur
* aktuelle Feuchtigkeit
* minimale und maximale´Temperatur seit Beginn der Aufzeichnung
* minimale und maximale Feuchtigkeit seit Beginn der Aufzeichnung
* Anzeige der x-Grafik Einstellung in Stunden
* grafische Darstellung über (wahlweise) den letzten 8 Stunden Temperatur und
Feuchtigkeit.
Sketch für diesen Test:
/*
A_Proj_07_Feucht_Temp_59
mit DHT22 genauere
Temperatur und Feuchtigkeit als DHT11
mit rot/gelb/grün-
Temperatur-Tendenz-LED
mit Nokia 5110
LCD-Display mit Poti für Hintergrundbeleuchtung Grafik von rechts nach links
aufbauen
DHT22:
S an digital Pin 2
GND und VCC an GND
und +5V
Tendenz-Leds:
rot an digital PIN
13
gelb an digital
PIN 12
grün an digital
PIN 11
Nokia 5110:
Nokia Pin 1 an
arduino digital PIN 6
Nokia Pin 2 an
arduino digital PIN 7
Nokia Pin 3 an
arduino digital PIN 5
Nokia Pin 4 an
arduino digital PIN 4
Nokia Pin 5 an
arduino digital PIN 3
Nokia Pin 6 an
arduino +5V
Nokia Pin 7 an
Poti Abgriff für Hintergrundbeleuchtung
Nokia Pin 8 an
arduino GND
Potentiometer
(Hintergrundbeleuchtung) GND, +5 V und Schleifer an Nokia Pin 7
*/
#include
<LCD5110_Graph.h>
#include <DHT22.h>
#define DHT22_PIN 2
DHT22
myDHT22(DHT22_PIN);
LCD5110
myGLCD(3,4,5,6,7);
extern uint8_t
SmallFont[];
extern unsigned
char TinyFont[];
float y,spanne;
//uint8_t* bm;
int pin=2; // DHT11
int rot=13; //rote
LED
int gelb=12;
//gelbe LED
int gruen=11;
//grüne LED
int xk; //
x-Koordinate 9 min bis 73 max = 64 Positionen.
int yt; //
y-Koordinate Temperatur 44 Pix 16° bis 8 max 28°
int yf; //
y-Koordinate Feuchtigkeit 44 Pix 52% bis 8 max 74%
int
xa[74],yta[74],yfa[74]; // Koordinate: x, Temperatur, Feuchtigkeit
int i,ii;
int zaehler;
unsigned long
previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung
vergangen sind
unsigned long
interval = 493600 ; // Interval in ms bis zum nächsten Grafikeintrag
// 444000= ca. 6-7
Stunden auf dem Display (55600 ms= ca. 1 Stunde)
// 246800 wären ca.
4 Stunden auf dem Display
// 493600 wären ca.
8 Stunden auf dem Display
DHT22 dht22(pin);
//float
celsius,feucht;
float temp, humi,
tempalt,tempneu,tmin,tmax,hmin,hmax;
int err;
void setup()
{
Serial.begin(9600);
pinMode(pin,
INPUT); //DHT11 Feuchtigkeitsmesser
pinMode(13,OUTPUT); // LED rot
pinMode(12,OUTPUT); // LED gelb
pinMode(11,OUTPUT); // LED grün
myGLCD.InitLCD();
myGLCD.setContrast(58);
//myGLCD.setFont(SmallFont);
myGLCD.setFont(TinyFont);
myGLCD.setFont(SmallFont);
myGLCD.drawRect(10, 8, 80, 40);
myGLCD.print("A_Proj_07_",
CENTER, 14);
myGLCD.print("Feucht_", CENTER, 22);
myGLCD.print("Temp_59", CENTER, 32);
digitalWrite(11,LOW); digitalWrite(12,LOW);digitalWrite(13,LOW);
myGLCD.update();
myGLCD.clrScr();
Serial.println("A_Proj_07_Feucht_Temp_59");Serial.println();
delay(2500);
myGLCD.setFont(TinyFont);
myGLCD.print("Temp", LEFT, 0);
myGLCD.print("28", LEFT, 6);
myGLCD.print("26", LEFT, 12);
myGLCD.print("24", LEFT, 18);
myGLCD.print("22", LEFT, 24);
myGLCD.print("20", LEFT, 30);
myGLCD.print("18", LEFT, 36);
//myGLCD.print("16", LEFT, 42);
myGLCD.print("Hum", 73, 0);
myGLCD.print("74", RIGHT, 6);
myGLCD.print("70", RIGHT, 12);
myGLCD.print("66", RIGHT, 18);
myGLCD.print("64", RIGHT, 24);
myGLCD.print("60",
RIGHT, 30);
myGLCD.print("56",
RIGHT, 36);
//myGLCD.print("52",
RIGHT, 42);
spanne=interval/1000*63/3600;
//in Stunden
myGLCD.printNumF(spanne,2,CENTER,8);myGLCD.print("h",50,8);
myGLCD.drawLine(8, 8, 8,41); // y-Koordinate links
myGLCD.drawLine(74,8,74,41); // y-Koordinate rechts
myGLCD.drawLine(8,40,74,40); // untere Begrenzung
myGLCD.drawLine(43,40,43,48);
ii=50;
for(i=9;i<=73;i++)
// 1-Wertzuweisung aller Grafikpunkte 9 bis 73
{
xa[i]=i;
yta[i]=ii;
yfa[i]=ii+10;
}
for(i=11;
i<=13; i++)// LEDs testen
{
digitalWrite(i,HIGH);
delay(200);
digitalWrite (i,LOW);
delay(200);
}
}
void loop()
{
myGLCD.update();
DHT22_ERROR_t errorCode;
errorCode =
myDHT22.readData();
tempalt=temp;
temp=
myDHT22.getTemperatureC()+0.4;
humi=myDHT22.getHumidity();
tempneu=temp;
if (tmin==0){tmin=temp;}//Anfangswert
if (tmax==0){tmax=temp;}
if (hmin==0){hmin=humi;}
if (hmax==0){hmin=humi;}
if (tmin>temp){tmin=temp;}
if (tmax<temp){tmax=temp;}
if (hmin>humi){hmin=humi;}
if (hmax<humi){hmax=humi;}
myGLCD.setFont(TinyFont);
myGLCD.printNumF(tmin,1, 0, 42);
myGLCD.printNumF(tmax,1, 20, 42);
myGLCD.printNumF(hmin,1, 48, 42);
myGLCD.printNumF(hmax,1, 68, 42);
if
(tempneu > tempalt){digitalWrite(11,HIGH);
digitalWrite(12,LOW);digitalWrite(13,LOW);delay(2000);}
if
(tempneu == tempalt){digitalWrite(11,LOW);
digitalWrite(12,HIGH);digitalWrite(13,LOW);}
if (tempneu
< tempalt) {digitalWrite(11,LOW); digitalWrite(12,LOW);digitalWrite(13,HIGH);
delay(2000);}
yt=(23-temp)*3+23;
// Temperatur
yf=(50-humi)*1.5+47.6;
//Feuchtigkeit
myGLCD.setFont(SmallFont);
myGLCD.printNumF(temp,1,15,0);
myGLCD.printNumF(humi,1,46,0);
if (millis() -
previousMillis > interval)
{
previousMillis = millis(); // aktuelle Zeit abspeichern
//
schieben neue temp und feucht in array x 73
yta[73]=
yt;
yfa[73]=
yf;
//
löschen alle allten temp und feucht pixel
for
(i=9;i<=73;i++)
{
myGLCD.invPixel(i,yta[i]);
myGLCD.invPixel(i,yfa[i]);
}
//
print Pixel neu in 73
//
myGLCD.setPixel(73,yta[73]);
//
myGLCD.setPixel(73,yfa[73]);
//
schieben alle temp und feucht 10 bis 73 in Grafik nach links
for
(i=9;i<=73;i++)
{
myGLCD.setPixel(i,yta[i+1]);
myGLCD.setPixel(i,yfa[i+1]);
}
//
7-temp und feucht in array
for
(i=9;i<=73;i++)
{
yta[i]=yta[i+1];
yfa[i]=yfa[i+1];
}
}
}
9. Wassermenge im Regenwassertank messen und per
Digitalanzeige und Power-LEDs anzeigen
10. Temperatur und
Feuchtigkeit mit 2,4" Touch-LCD
wie 8. Temperatur und Feuchtigkeits Messer mit DHT22
Temperatur-Sensor mit einer Genauigkeit von +/- 0,5 °
jedoch Grafik-Anzeige mit 2,4" Touch
Color-LCD.

Grafik-Display - Pixel-Koordinierung:

Sketch für Temperatur und
Feuchtigkeit mit 2,4" Touch-LCD:
String file= "A_Projekt_07_Feucht_Temp_143";
// ohne array, Grafik nur von links nach rechts, und wenn voll, neu beginnen
// Temp und Feucht korrigier, da im eingebauten Zustand falsche Werte angezeigt
wurden
// (Zeilen 111 und 112)
/* 2.4 inch LCD TFT Display uses digital pins 5-13 and analog 0-3.
That means you can use digital pins 2, 3 ???? nicht 2, 3 und 4?
and analog 4 and 5.
Eventuell frei auch Pin 12, da die micro SD nicht gebraucht wird.
Display digital 5-13 und analog 0-3.
Frei Pins 2 und 3 (und 4??) und analog 4 und 5
DHT22 an d2 (und GND und +5V)
vorbereitet für Barometer BMP180 SDA an a4 und SCL an a5 und (GND und +3,3V)
*/
// DHT22
#include <DHT22.h>
#include <Adafruit_GFX.h>
#include <SWTFT.h>
//2,4" LCD Grafik-Display
#define DHT22_PIN 2
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GRAU 0xBDF7
#define ORANGE 0xFBE0
DHT22 myDHT22(DHT22_PIN);
SWTFT tft;
int err;
int pin=2;
DHT22 dht22(pin);
float temp, humi;
int i,x,y,diff,ygrad,yfeucht,grad,feucht,xk, xposition;
int anzahl;
float tempsum, tempdurch, humisum, humidurch;
int messungen=0;
float mint, maxt, minf, maxf, ytemp,yhumi,j;
unsigned long vergangeneMillis = 0;
unsigned long zyklus; // Interval zwischen zwei Änderungen
void setup(void)
{
Serial.begin(9600);
Serial.print("Sketch: ");Serial.println(file);
// klappt nicht immer, wenn diese 3 Zeilen nicht vorhanden sind.
tft.reset();
long identifier = tft.readID();
tft.begin(identifier); delay(500);
tft.fillScreen(BLACK);
int h=330;int w=240;
for(y=0; y<h; y+=10) tft.drawFastHLine(0, y, w, GREEN);
for(x=0; x<w; x+=10) tft.drawFastVLine(x, 0, h, YELLOW);
tft.drawLine(239,0,239,340,YELLOW);//rechter senkrechter Abschluß
tft.drawLine(0,319,239,319,GREEN);// unterer waagerechter Abschluß
tft.drawRect(25, 20, 190, 60, WHITE); // x0,y0,diffx,diffy
tft.fillRect(26, 21, 188, 58, BLUE);
tft.setTextColor(YELLOW);tft.setTextSize(1);
tft.setCursor(40,30);
tft.print(file);
// hier darf kein delay über 1070 rein, sonst wird das Display nicht von
// dem Gitter-Netz gesäubert
delay(500);
zyklus=20000;// Neuer Grafikaeintrag jeweils in Millisekunden
xposition=23;
}
void loop(void)
{
messen();
durchschnitt();
koordinaten();
gitter();
aktuell();
messungen++;
if ((millis()- vergangeneMillis) > zyklus)
{
vergangeneMillis = millis();
grafikaufbau();
xk=0; anzahl=0; humisum=0;tempsum=0;tempdurch=0;humidurch=0;
}
delay(700); //kleines delay() verhindert neuen Temperatur-Aufbau.
} // Ende loop ----------
int messen()
{
DHT22_ERROR_t errorCode;
errorCode = myDHT22.readData(); delay(400);
temp= (myDHT22.getTemperatureC()-15.5);// korrigiert -12,9 vorher
humi=(myDHT22.getHumidity()+0.5); //korrigiert -6.6 vorher
delay(800);
Serial.print(temp);Serial.print(" ");Serial.println(humi);
// Grafikpunkte berechnen
ytemp=(33-temp)*15+8; yhumi=(82-humi)*7.5+7;
if (temp<0 )// wenn erste Messung = -99,9 Grad, dann:
{mint=50;maxt=10;minf=90;maxf=10;temp=20;humi=60;}
if (messungen==2 )// erste Messung in min und may übernehmen
{mint=temp;maxt=temp;minf=humi;maxf=humi;}
if (messungen==1){mint=temp;maxt=temp;minf=humi;maxf=humi;}
// minimal und maximal Temperaturen festlegen
if (mint>temp) {mint=temp;}
if (maxt<temp) {maxt=temp;}
if (minf>humi) {minf=humi;}
if (maxf<humi) {maxf=humi;}
} // Ende messen ----------
int aktuell()
{
long identifier = tft.readID();//ohne diesen Befehl baut sich das Diplay nicht
mehr auf
tft.setTextSize(1);
//lcd.print("Daten" "\xF5" "bertragung");
tft.setTextColor(YELLOW); tft.setCursor(100,310); tft.print("\x1B" " min
""\x1A");
tft.setCursor(100,290); tft.print("\x1B" " max ""\x1A");
tft.fillRect(120, 300,70,8, BLACK); // alte Variable messungen löschen
//tft.setTextColor(WHITE);tft.setCursor(160,300); tft.print(messungen);
tft.setTextColor(WHITE);tft.setCursor(141,300); tft.print(messungen);
tft.setTextColor(WHITE);tft.setCursor(120,300); tft.print(xk);
xk++;
y=285; tft.drawLine(0,y,319,y, WHITE);// unterer weißer Strich einfügen
tft.setTextColor(WHITE);
i =zyklus/1000*189/60; // Bereich in Minuten
tft.setCursor(105,3); tft.println(zyklus/1000);
tft.setCursor(123,3); tft.print(i);
// Serial.print(zyklus); Serial.print(" "); Serial.println(i);
tft.drawLine(23,17,214,17,WHITE);// oben quer
tft.fillRect(26, 0, 59, 16, BLACK); // oben Temperatur löschen
tft.fillRect(156, 0, 57, 16, BLACK); // oben Feuchtigkeit löschen
// aktuelle Daten oben links und rechts eintragen
tft.setTextSize(2);
tft.setTextColor(RED); tft.setCursor(34,0); tft.println(temp,1);
tft.setTextColor(BLUE); tft.setCursor(159,0); tft.println(humi,1);
// min und max Temp und Feucht. einblenden
//zuerst alten Eintrag löschen
tft.fillRect(0,289, 47, 31, BLACK); // links Temperatur min/max löschen
tft.setTextColor(RED); tft.setCursor(0,306); tft.print(mint,1);
tft.setCursor(0,289); tft.print(maxt,1);
//zuerst alten Eintrag löschen
tft.fillRect(190, 289,49,31, BLACK); // rechts Feucht min/max löschen
tft.setTextColor(BLUE); tft.setCursor(192,306); tft.print(minf,1);
tft.setCursor(192,289); tft.print(maxf,1);
}
// Ende aktuell ----------
int grafikaufbau()
{
// nun Daten in Grafik einfügen
xposition++;
tft.drawPixel(xposition,ytemp,RED);
tft.drawPixel(xposition,yhumi,BLUE);
if (xposition == 213)
{
koordinaten();
gitter();
aktuell();
xposition=23;
}
}
// Ende grafikaufbau --------------
int koordinaten()
{
tft.fillScreen(BLACK);
// linke y-Achse Grad C - rot
//x=23; tft.drawLine(x,0,x,319, RED);
x=23; tft.drawLine(x,0,x,285, RED);
// rechte y-Achse Feuchtigkeit % - blau
x=214; tft.drawLine(x,0,x,285, BLUE);
// linke Grad- Bezeichnungen einfügen (15 bis 32 Grad)
tft.setTextColor(RED);tft.setTextSize(2);
ygrad=15;// Beginn 2 Zeile von oben
for (grad=32;grad>=15;grad--) //jeweils 1 Grad weniger
{
tft.setCursor(0,ygrad); tft.print(grad);
ygrad=ygrad+15; // y-Positin jeweils 15 Pixel mehr
}
//ygrad=0;
// rechte Feuchtigkeits - Bezeichnungen einfügen (46 - 80%)
tft.setTextColor(BLUE);
yfeucht=15;// Beginn 2 Zeile von oben
for (feucht=80;feucht>=46;feucht=feucht-2)
{
x=216;
tft.setCursor(x,yfeucht); tft.print(feucht);
yfeucht=yfeucht+15;
}
yfeucht=0;
//x-Koordinate einfügen weiß
y=285; tft.drawLine(0,y,319,y, WHITE);
// Dimensionen einfügen
tft.setTextColor(RED); tft.setCursor(0,0); tft.print(char(247));tft.print("C");
tft.setTextColor(BLUE); tft.setCursor(215,0); tft.print("%F");
tft.setTextSize(1); tft.setTextColor(WHITE); tft.setCursor(38,20);
tft.print(file);
} // --- Ende koordinaten ---
int gitter()
{
//Diagramm-Gitter aufbauen
//for (y=22;y<=285;y=y+30) {tft.drawLine(24,y,213,y, GRAU);}
for (y=52;y<=285;y=y+30) {tft.drawLine(24,y,213,y, GRAU);}
//kurze Linie Temperatur
for (y=(7+30);y<=277;y=y+30) {tft.drawLine(24,(y),30,(y),GRAU);}
//kurze Linie Feuchtigkeit
for (y=(7+30);y<=277;y=y+30){tft.drawLine(207,(y),213,(y),GRAU);}
}
// --- Ende gitter ---
//Durchschnittswerte innerhalb der Messungen ohne Grafikaufbau
int durchschnitt()
{
anzahl++;
tempsum = tempsum + temp; humisum=humisum + humi;
tempdurch=tempsum/anzahl; humidurch=humisum/anzahl;
// Grafikpunkte berechnen
ytemp=(33-tempdurch)*15+8; yhumi=(82-humidurch)*7.5+7;
}// --- Ende durchschnitt ---
/*
ohne Durchschnittswerte ist "A_Projekt_07_Feucht_Temp_139"
int anzahl;
float tempsum, tempdurch, humisum, humidurch;
anzahl=0;
if (xk>0)
{
anzahl++;
tempsum = tempsum + temp; hmisum=humisum+humi;
tempdurch=tempdurch/anzahl; humidurch=humidurch/anzahl;
}
--- Ende 10. Temperatur und
Feuchtigkeit mit 2,4" Touch-LCD ---
11. Campari-Kühler mit Arduino und Peltier-Modul
Die "Kreativ mit Technik-Zeitschrift" Make 5/2016
hat meinen Campari Kühler auf 2 Seiten ins rechte Licht
gestellt.
Ich wollte bei unserem Erhohlungs-Platz etwas Arduino-mäßiges
einsetzen, was man in dieser Art nicht käuflich erwerben kann.
Da ich in der 80cm dicken Mauer schon vor vielen Jahren ein
Holzkästchen mit Stromversorgung einbauen ließ, konnte ich (zwar mit
Platzproblemen) einen Campari-Kühler einbauen.
< Kleine Bilder jeweils anklicken zum Vergrößern
Dazu habe ich über ein Peltier Modul den Campari-Kühler
zusammengebaut.
Das Peltier Modul ist ein elektrothermischer Wandler,
der bei Stromdurchfluss eine Temperaturdifferenz erzeugt. Peltier-Elemente
können sowohl zur Kühlung als auch zum Heizen verwendet werden. (Man kann mit
ihm bei Temperaturdifferenz auch Strom erzeugen).
<< Peltier Element 40x40x4 mm (12 V, 60W, TEC1-12706) Ich steuere
es nur mit 7 V an, da es für die Campari-Kühlung ausreichend ist.
Damit schafft der Peltier-Kühler ca. 10° gegenüber der Umgebung abzukühlen.
<< so sieht ein Peltier Element von innen aus.
Es ist mir auf den Boden gefallen und war kaputt. Deshalb konnte ich es
aufbrechen und begutachten. Da sind immerhin 128 PN und NP Übergänge eingebaut
und das Teil kostet in China lediglich 2,08€ incl. Versand nach Teneriffa von
AliExpress.com (Juni 2015).
Hier das Modul-Schema meines Campari-Kühlers:

Und so sieht der Elektronik-Aufbau aus:
<<
Oben der Spannungs-Regulator 2-3 A mit Anzeige der eingestellten Spannung.
Dann das LCD-Display LCD 1602-I2C
Darunter das Herzstück, der Arduino und daneben das Relais um
den hohen Peltier-Strom ein und ausschalten zu können, je nachdem, ob die
Wunschtemperatur erreicht ist oder nicht.
und ganz unten das Verteiler-Platinchen
Der Test für die Funktionsfähigkeit:
<< Man sieht, daß die Kühlung von 16:22 bis 16:50 von 22,7° auf
10,6° erfolgt ist.
Gehe davon aus, daß die Temperatur-Reduzierung bei 7 Volt ca.
10° beträgt. Dies ist aber abhängig, wie gut die Wärmedämmung der "Kühlkammer"
(ich habe um die Campari-Flasche eine 2 cm dicke Wärmedämmung gepackt) und wie
hoch die Spannung (der Strom) eingestellt wird.
Hier kann man sehen, wieviel Grad die "Kühlkammer" hat, ob das
Peltier-Element ein- oder aus- geschaltet ist und wie die Wunsch-Temperatur im
Moment eingestellt wurde. Hier im Bild: da die momentane Kühlkammer-Temperatur
größer oder gleich der eingestellten Wunschtemperatur ist, ist das
Peltier-Kühlelement "EIN" - geschaltet.
Hier der Campari-Kühler in Aktion:

Und hier sieht man die Campari-Flasche im wärmegedämmten
Kühlfach:

Und hier noch der einfache kurze C++ -Sketch:
String file="Campari_11";
// mit Arduino uno und DHT11
// mit Umschalt-Taster Ein/Ausschaltpunkt Verstellung des Peltie Elementes (Pin
5 und 6)
// Ausgangabasis: DHT11_Temp_Feucht_13_02
// zusätzlich LCD_LiquidCrystal_I2C_CustomChar_02
// zusätzlich 5 V-Relais für Stromabschaltung des Peltier Moduls bei Innentemp.
<mint°
// LCD:
// SDA an analog 4
// SCL an analog 5
const int relayPin = 2; // Relais
/* Tastenabfrage Grundsätzlich:
pinMode(5, INPUT); // Pin 5 ist jetzt Tasten-Eingang
digitalWrite(2, HIGH);// anstelle eines Pullup Widerstandes
if ( digitalRead(2) == LOW ) {Wunschtemperatur niedriger}
if ( digitalRead(2) == HIGH ) {Wunschtemperatur höher}
*/
// -------------------------
int mint=14;//Einstellung der Start-Relais-Ausschalttemperatur
// -------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
uint8_t degree[8] = {140,146,146,140,128,128,128,128};
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <DHT11.h>
int pin=4;
DHT11 dht11(pin);
void setup()
{
pinMode(5, INPUT); // Pin 5 ist ein Taste minus 1 Grad
pinMode(6, INPUT); // Pin 6 ist ein Taste plus 1 Grad
digitalWrite(5, HIGH); // Taste minus
digitalWrite(6, HIGH); // Taste plus
pinMode(relayPin, OUTPUT);
lcd.begin();
lcd.home();
lcd.print(file);
delay(2000);
lcd.createChar(8, degree);
lcd.home();
lcd.print(" CAMPARI-cooler ");
Serial.begin(9600);
Serial.println(file);Serial.println();
}
void loop()
{
if ( digitalRead(5) == LOW ) {(mint=mint-1);}
if ( digitalRead(6) == LOW ) {(mint=mint+1);}
int err;
float temp, humi;
if((err=dht11.read(humi, temp))==0)
{
lcd.setCursor(0, 1);
lcd.print(temp,0);lcd.write(8);// Grad-Zeichen
if (temp>=mint)
{
lcd.setCursor(6, 1);
//lcd.print("EIN");
lcd.print("EIN");
lcd.setCursor(11, 1);
lcd.print(">=");lcd.print(mint);lcd.write(8);
digitalWrite(relayPin, HIGH);delay (1000);
}
else
{
lcd.setCursor(6, 1);
lcd.print("AUS");
lcd.setCursor(11, 1);
lcd.print("<");lcd.print(mint);lcd.write(8); lcd.print(" ");
digitalWrite(relayPin, LOW);delay (1000);
}
Serial.print(temp,0);
Serial.print(char(176));
Serial.print(" Feuchtigkeit: ");
Serial.print(humi,0);
Serial.print(char(37));
Serial.println();
}
else
{
Serial.println();
Serial.print("Error No :");
Serial.print(err);
Serial.println();
}
delay(DHT11_RETRY_DELAY); //delay for reread
}
am 25. Juni 2015 erfolgreich getestet.
----------------------------------------------------------------------------------------------------------------
|