| Passwort vergessen?

Allzeit guten Wind wünscht Euch Hermann

Forum | Registrieren | Suche | Regeln | FAQ | Impressum
1 Benutzer online

 

Arduino als Steuerung - Ein Beispiel
 1
19.10.2016 15:47
Alibaba 
Arduino als Steuerung - Ein Beispiel

Hallo zusammen, wie versprochen hab ich mal den Arduino hergenommen und ihn als kleine Steuerung für Temperatur und Lüfter hergerichtet, basierend auf meinen anderen Beitrag hier im Forum. Ich baue hier mit diesem Beitrag auf den anderen auf, schon was die Bauteileliste angeht.

zum Technischen:

- Ich habe ein oledDisplay mit I2C gewählt, weil ich diese kleine Anlage noch mit eine Spannungs- und Strommeter ausrüsten will, auch dieses Modul hat einen I2C Anschluss. Es kann aber einfach mit einem LCD Display für den Arduino ersetzt werden, dabei bitte das Programm anpassen.

- Der Transistor für das Relais ist so verschaltet: Blauer Draht=Emitter, 10k Widerstand=Basis, Cyan=Kollektor. Das Relais selbst kann auch durch einen Transistor ersetzt werden, Hauptsache er kann den Lüfter ansteuern. Ich habe deshalb ein Relais gewählt, weil ich im Sommer damit auch eine Lüftung Im Keller mitbetreibe.

- für den Temperaturfühler habe ich einen DS18B20 gewählt, weil er einfach und unkompliziert ist, und er die Daten digital übermittelt. Die Abweichung beträgt grad mal ein halbes Grad, reicht völlig aus. Und er kann wie ein NTC (wärmeempfindlicher Widerstand) mit 2 Leitungen (parasitärer Betrieb) betrieben werden. Allerdings, jeder DS18B20 hat eine interne Adresse, diese muss zuerst ermittelt werden und im Sketch eingetragen werden - siehe auch als Beispiel http://fluuux.de/2012/09/arduino-adresse...1820-ermitteln/

- die beiden Taster habe ich zur Einstellung der Schwelltemperatur dazu gemacht. Standartwert beim Einschalten ist 25 Grad, solange man auf eine Taste draufbleibt wird der Wert im Sekundentakt erhöht bzw erniedrigt. Das Display flackert sowiso jede Sekunde, das ist auch der Takt.

- Der Arduino macht folgendes: Es wird ca. jede Sekunde die Temperatur ausgelesen, wenn höher als der Schwellwert wird das Relais angezogen, wenn nicht, fällt es ab. Das Display wird gelöscht (daher das kurze Flackern), Temperatur und der Schwellwert wird ausgegeben, und alles beginnt von vorne. Wird eine Taste gedrückt wird der Schwellwert verändert.

- Da der TemperaturFühler ja nicht draussen im Nassen sind habe ich die billigste Variante gewählt, anlöten und mit Schrumpfschlauch versehen kann ich selber. Wer lieber eine bereits vergossene version will den sei diese Version empfohlen: http://www.banggood.com/Wholesale-DS18B2...ml?rmmds=search

- Die Tasten Ich habe meine Taster einfach aus einem alten Kopierer ausgelötet, wer dazu keinen Zugang hat siehe Bauteileliste. Wer sich einen Arduino mit Starterteilen gekauft hat hat meistens bereits ein paar dabei.

- Ich habe den Sketch auch auf einem Arduino Nano getestet, keine Probleme damit. Allerdings, die Anschlüsse SCL und SDA fürs Display sind beim Nano auf A4 und A5 - hier hilft googlen mit "Arduino nano pin"

- Widerstände und Transistor: aus meiner Schrottkiste, ansonsten nen Kollegen/in fragen, ob die was rumliegen hat. Wer mag kann sich die Sachen auch kaufen, rentiert sich bei den 3 Teilen aber nicht.

Da ich selbst nicht so toll im Programmieren bin und mir die Teile im Netz suche ist auch die Bedienung recht puristisch, dennoch hoffe ich, dass es euch als Beispiel und als Grundlage weiterhilft. Auf alle Fälle ist es ratsam, die Schaltung auf einen Steckbrett aufzubauen, und alles gut zu testen. Falls ihr euch mit Elektronik garnicht auskennt bittet jemand um Hilfe, schon was das Löten anbelangt. Ansonsten gutes Gelingen!

Hier noch die Kaufliste:

Oled-Display http://www.banggood.com/0_96-Inch-4Pin-I...ml?rmmds=search

Temperaturfühler DS18B20 http://www.banggood.com/5Pcs-DS18B20-Tem...ml?rmmds=search

Taster z.b. http://www.banggood.com/50Pcs-Tactile-Pu...ml?rmmds=search

Arduino setz ich mal voraus, auf Banggood gibts auch die um günstiges Geld zum Bestellen. Siehe auch mein letzter Beitrag "2 Kollektoren".


Hier mal der Schaltplan mit fritzing erstellt:


Selbst gezeichnet


Der Sketch

#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ds(2); //pin für ds1820
//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28, 0xFF, 0x4F, 0x1B, 0x36, 0x16, 0x3, 0xC9 };
char sensor1Name[] = "Temp ";
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C

#define SERVO1_PIN 9 // "moving up and down"

// Servo- / application-specific constants:
#define MOTION_DELAY 20
#define MIN_ANGLE_PAN 1
#define MAX_ANGLE_PAN 178
#define MIN_ANGLE_TILT 1
#define MAX_ANGLE_TILT 129

char buffer[16];
SSD1306AsciiWire oled;
int etemp=25;
int entprellZeit=20;
int relais=3;
Servo Servo1;
void setup(void)
{
oled.begin(&Adafruit128x64, I2C_ADDRESS);
oled.set400kHz();
oled.setFont(Arial_bold_14);
oled.clear();
pinMode(A0,INPUT); // Taste 0 hoch
digitalWrite(A0,HIGH); // interner pullup Widerstand
pinMode(A1,INPUT); // Taste 1 runter
digitalWrite(A1,HIGH); // interner pullup Widerstand
pinMode(relais,OUTPUT); // Augang zum Relais
etemp = 25;
Servo1.attach(SERVO1_PIN);
}

void writeTimeToScratchpad(byte* address)
{
//reset the bus
ds.reset();
//select our sensor
ds.select(address);
//CONVERT T function call (44h) which puts the temperature into the scratchpad
ds.write(0x44,1);
//sleep a second for the write to take place
delay(900);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
//reset the bus
ds.reset();
//select our sensor
ds.select(address);
//read the scratchpad (BEh)
ds.write(0xBE);
for (byte i=0;i<9;i++){
data[i] = ds.read();
}
}
float getTemperature(byte* address)
{
int tr;
byte data[12];
writeTimeToScratchpad(address);
readTimeFromScratchpad(address,data);
//put in temp all the 8 bits of LSB (least significant byte)
tr = data[0];
if (address[0] == 0x10) // DS18S20
{
//check for negative temperature
if (data[1] > 0x80)
{
tr = !tr + 1; //two’s complement adjustment
tr = tr * -1; //flip value negative.
}
//drop bit 0
tr = tr >> 1;
//COUNT PER Celsius degree (10h)
int cpc = data[7];
//COUNT REMAIN (0Ch)
int cr = data[6];
return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
else // DS18B20
{
return ((data[1] << 8) + tr) * (float)0.0625;
}
}


void loop(void)
{
static const uint16_t MIN_ANGLE = min(MIN_ANGLE_PAN, MIN_ANGLE_TILT);
static const uint16_t MAX_ANGLE = max(MAX_ANGLE_PAN, MAX_ANGLE_TILT);
float temp1 = getTemperature(sensor1);

if(readButton(0)) etemp+=1; // wärmer
if(readButton(1)) etemp-=1; // kälter
if(etemp > 50) etemp=50; // die obere Grenze
if(etemp < 10) etemp=10; // die untere Grenze
oled.clear();
oled.print("Temp ");
oled.print(temp1);
oled.print(" ");
oled.print(etemp);
if (temp1 >= etemp)
{
digitalWrite(relais, HIGH);
Servo1.write(map(200, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}
else
{
digitalWrite(relais, LOW);
Servo1.write(map(1, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}

}
int readButton(int pin) { // Taste einlesen
if(analogRead(pin) < 500) { // Analog Eingang abfragen
delay(entprellZeit);
if(analogRead(pin) < 500)
return 1; // war gedrückt
}
return 0; // war nicht gedrückt
}

20.10.2016 10:24
plataaaa 
Re: Arduino als Steuerung - Ein Beispiel

dein Sketch wird zwar funktionieren, aber das Servo bzw. das Relay werden ziemlich oft schalten müssen, wenn die Temp
immer wieder zwischen 49 und 50 sein wird. Du musst hier eine art Nachlauf einbauen, damit die Temperatur sich erholen kann und das Relay bzw. der Servo nicht immer hin und herschalten.

20.10.2016 10:34
Alibaba 
Re: Arduino als Steuerung - Ein Beispiel

Danke dass du mich darauf aufmerksam machst, ich bin da nicht so gut im programmieren, könntest du da eine Verbesserung dazu programmieren?

20.10.2016 12:09
plataaaa 
Re: Arduino als Steuerung - Ein Beispiel

die etemp kannst Du Dir ja sparen, hier mal eine Umprogrammierung mit einer Pause von 60 Sekunden, sollte reichen...

...

if(readButton(0)) etemp+=1; // wärmer
if(readButton(1)) etemp-=1; // kälter

oled.clear();
oled.print("Temp ");
oled.print(temp1);
oled.print(" ");
oled.print(etemp);

boolean to50 = false;
boolean to10 = false;
if (temp1 <= 10 && !to10)
{
if(to50)
{
to50 = true;
delay(60000) //Pause 1min. ggf. hoeher setzen
}
else if(!to50)
{
digitalWrite(relais, LOW);
Servo1.write(map(1, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}
}
else if (temp1 >10 && !to50)
{
to10 = false;
to50 = true;
digitalWrite(relais, HIGH);
Servo1.write(map(200, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}

20.10.2016 12:10
plataaaa 
Re: Arduino als Steuerung - Ein Beispiel

plataaaa:
die etemp kannst Du Dir ja sparen, hier mal eine Umprogrammierung mit einer Pause von 60 Sekunden, sollte reichen...

...

if(readButton(0)) etemp+=1; // wärmer
if(readButton(1)) etemp-=1; // kälter

oled.clear();
oled.print("Temp ");
oled.print(temp1);
oled.print(" ");
oled.print(etemp);

boolean to50 = false;
boolean to10 = false;
if (temp1 <= 10 && !to10)
{
if(to50)
{
to50 = true;
delay(60000) //Pause 1min. ggf. hoeher setzen
}
else if(!to50)
{
digitalWrite(relais, LOW);
Servo1.write(map(1, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}
}
else if (temp1 >10 && !to50)
{
to10 = false;
to50 = true;
digitalWrite(relais, HIGH);
Servo1.write(map(200, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}

oh je ein Fehler, hinter dem delay(60000) fehlt das ;
also:
if(readButton(0)) etemp+=1; // wärmer
if(readButton(1)) etemp-=1; // kälter

oled.clear();
oled.print("Temp ");
oled.print(temp1);
oled.print(" ");
oled.print(etemp);

boolean to50 = false;
boolean to10 = false;
if (temp1 <= 10 && !to10)
{
if(to50)
{
to50 = true;
delay(60000); //Pause 1min. ggf. hoeher setzen
}
else if(!to50)
{
digitalWrite(relais, LOW);
Servo1.write(map(1, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}
}
else if (temp1 >10 && !to50)
{
to10 = false;
to50 = true;
digitalWrite(relais, HIGH);
Servo1.write(map(200, MIN_ANGLE, MAX_ANGLE, MIN_ANGLE_TILT, MAX_ANGLE_TILT));
}

 1
50Pcs-Tactile-Pu   application-specific   wärmeempfindlicher   entprellZeit=20   digitalWrite   Programmieren   Schrumpfschlauch   Wholesale-DS18B2   rmmds=search   readTimeFromScratchpad   readButton   Umprogrammierung   Temperatursensoren   Schwelltemperatur   Widerstand=Basis   Arduino   Temperaturfühler   SSD1306AsciiWire   5Pcs-DS18B20-Tem   writeTimeToScratchpad

Forum | Registrieren | Suche | Regeln | FAQ | Impressum
Zur Zusammenfassung,Black 300
Befreundete Foren
Info:Datenschutzgrundverordnung

 

Forum | Registrieren | Suche | Regeln | FAQ | Impressum

  


© by HH Mahnecke 2009-2019| phpFK Download | www.phpFK.de

Sponsoren: Zur Homepage | http://www.stellenangebote-forum.de/about71534.html | FOREX