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