Teneriffa genießen

Home

Nach oben
Wetter
Wandern
GPS-Navigation
Fotografieren
Rezepte
Monarch
Interessantes
Familie privat
Freunde
So wohnen wir
Kontakt
Arduino
Vulkanausbruch

Nach oben
Roboter
Pozo

<<<<<<<<<<<<<<<<<<<<<<< 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++

<<< das 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
2. Transistor (und Diode, Widerstand, Kondensator und Induktivität) Meßgerät (als Arduino-Bausatz)

 

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
5. Roboter (mit C++ Sketch)
6. Test Solarpanel-Nachführung (mit C++ Sketch)
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. (mit C++ Sketch)
9. Wassermenge im Regenwassertank messen und per Digitalanzeige und Power-LEDs anzeigen
10. Temperatur und Feuchtigkeit mit 2,4" Touch-LCD
11. 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

    Phase I mit Abstandsfühler und automatischem Abdrehen vor den Hindernissen.
    Phase II mit Fernsteuerung und einzeln fernsteuerbaren Front und Rücklichtern.

hier ein Beispiel des Roboter-Projektablaufs mit Sketch (Programm)  in C++

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.

----------------------------------------------------------------------------------------------------------------

USB-Treiberproblem mit Arduino UNO R3 SMD-Mikrocontroller -Platinen
Problem gelöst!  siehe hier