Unimik: Unterschied zwischen den Versionen
Sysd0b (Diskussion | Beiträge) |
Sysd0b (Diskussion | Beiträge) |
||
Zeile 49: | Zeile 49: | ||
== Erste Versuche == | == Erste Versuche == | ||
− | Ich fang mit den DS18S20 als Temperatursensor an welcher mit [https://de.wikipedia.org/wiki/1-Wire One-Wire] arbeitet, dafür muss ich die Arduino IDE um Library`s [http://arduino.cc/de/Guide/Libraries erweitern]. Das heisst [http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip Library] & [http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip DallasTemperature] Library herunterladen und in das Arbeitsverzeichnis von Arduino entpacken. Dann bin ich auf fertige Sketche gestossen, das [http://fluuux.de/2012/09/arduino-adressen-aller-ds1820-ermitteln/ erste] ermittelt die angeschlossenen DS18S20, das [http://fluuux.de/2012/09/arduino-gezielt-einen-ds1820-temperatur-sensor-auslesen/ zweite] kann diese dann auslesen. Danke an fluuux.de =) Also los gehts, 2 | + | Ich fang mit den DS18S20 als Temperatursensor an welcher mit [https://de.wikipedia.org/wiki/1-Wire One-Wire] arbeitet, dafür muss ich die Arduino IDE um Library`s [http://arduino.cc/de/Guide/Libraries erweitern]. Das heisst [http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip Library] & [http://download.milesburton.com/Arduino/MaximTemperature/DallasTemperature_372Beta.zip DallasTemperature] Library herunterladen und in das Arbeitsverzeichnis von Arduino entpacken. Dann bin ich auf fertige Sketche gestossen, das [http://fluuux.de/2012/09/arduino-adressen-aller-ds1820-ermitteln/ erste] ermittelt die angeschlossenen DS18S20, das [http://fluuux.de/2012/09/arduino-gezielt-einen-ds1820-temperatur-sensor-auslesen/ zweite] kann diese dann auslesen. Danke an fluuux.de =) |
+ | |||
+ | Also los gehts, Breadboard ist wie folgt bestückt: | ||
+ | * 2x DS18S20 + 1x 4,7kOhm (Data an Pin2) | ||
+ | * 2x Led`s + 2x 220 Ohm (LED an Pin3,4) | ||
+ | Der folgende Entwurf soll die grüne LED solange leuchten lassen, solange die Temperatur 25°C überschreitet, wenn das der Fall ist soll die grüne ausgehen und die rote LED leuchten. | ||
+ | <pre> | ||
+ | #include <OneWire.h> | ||
+ | #include <DallasTemperature.h> | ||
+ | |||
+ | // Pin Belegung | ||
+ | OneWire ds(2); // Datenpin für DS18S20 | ||
+ | int led1 = 3; // grün | ||
+ | int led2 = 4; // gelb | ||
+ | |||
+ | //DeviceAdressen | ||
+ | DeviceAddress sensor1 = { 0x10, 0x0, 0x74, 0xB3, 0x2, 0x8, 0x0, 0xA9 }; | ||
+ | DeviceAddress sensor2 = { 0x10, 0x19, 0xBD, 0xB4, 0x2, 0x8, 0x0, 0x33 }; | ||
+ | |||
+ | // Sensor NBame für die Ausgabe auf dem Serial Monitor | ||
+ | char sensor1Name[] = "Sensor1: "; | ||
+ | char sensor2Name[] = "Sensor2: "; | ||
+ | |||
+ | |||
+ | void setup(void) | ||
+ | { | ||
+ | Serial.begin(9600); | ||
+ | pinMode(led1, OUTPUT); | ||
+ | pinMode(led2, OUTPUT); | ||
+ | } | ||
+ | |||
+ | 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(1000); | ||
+ | } | ||
+ | |||
+ | 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]; | ||
+ | |||
+ | //check for negative temperature | ||
+ | if (data[1] > 0x80) | ||
+ | { | ||
+ | tr = !tr + 1; //two's complement adjustment | ||
+ | tr = tr * -1; //flip value negative. | ||
+ | } | ||
+ | |||
+ | //COUNT PER Celsius degree (10h) | ||
+ | int cpc = data[7]; | ||
+ | //COUNT REMAIN (0Ch) | ||
+ | int cr = data[6]; | ||
+ | |||
+ | //drop bit 0 | ||
+ | tr = tr >> 1; | ||
+ | |||
+ | return tr - (float)0.25 + (cpc - cr)/(float)cpc; | ||
+ | } | ||
+ | |||
+ | void loop(void) | ||
+ | { | ||
+ | float temp1 = getTemperature(sensor1); | ||
+ | float temp2 = getTemperature(sensor2); | ||
+ | |||
+ | int temp1_int = getTemperature(sensor1); | ||
+ | |||
+ | Serial.print(sensor1Name); | ||
+ | Serial.print(temp1); | ||
+ | Serial.println(" Celsius"); | ||
+ | |||
+ | |||
+ | // Temperaturüberwachung led | ||
+ | if (temp1_int > 25){ | ||
+ | digitalWrite(led2, HIGH); // turn the LED off by making the voltage LOW | ||
+ | digitalWrite(led1, LOW); // turn the LED off by making the voltage LOW | ||
+ | } | ||
+ | else{ | ||
+ | digitalWrite(led2, LOW); // turn the LED off by making the voltage LOW | ||
+ | digitalWrite(led1, HIGH); | ||
+ | } | ||
+ | |||
+ | // Erstmal nur als Referenz ohne LED | ||
+ | Serial.print(sensor2Name); | ||
+ | Serial.print(temp2); | ||
+ | Serial.println(" Celsius"); | ||
+ | |||
+ | Serial.println(); | ||
+ | delay(1000); | ||
+ | } | ||
+ | </pre> | ||
== Links == | == Links == | ||
* [http://fluuux.de/2012/08/arduino-temperatur-auslesen-und-auf-display-ausgeben/ Arduino Temperatur + Display] | * [http://fluuux.de/2012/08/arduino-temperatur-auslesen-und-auf-display-ausgeben/ Arduino Temperatur + Display] | ||
* [http://www.wateb.com/arduino-gps-shield-lcd-16x2/ Arduino + GPS + LCD 2x16] | * [http://www.wateb.com/arduino-gps-shield-lcd-16x2/ Arduino + GPS + LCD 2x16] |
Version vom 13. Februar 2014, 02:18 Uhr
Unimik steht für Unimog-Mikrocontroller, er soll Informationen über ein Fahrzeug messen, auswerten und ausgeben können.
Der Ideengeber des Unimik war Thomas mit seinen Getriebewächter, super Idee und Umsetzung!
Vorplanung
- Sensoren
- 7x Temperatursensoren Getriebe
- 1x Temperatursensor Motor
- 1x Temperatursensor Kühlwasser
- 1x Temperatursensor Aussen
- 1x Hygrometer Aussen
- 1x GPS Einheit
- 1x Durchflussmesser Benzin
- 1x Neigungssensor (x,y,z)
- Funktionen
- Anzeige schaltbar für Aussen-, Motor- und Getriebetemperaturen (LCD)
- Warnen bei kritischen Aussen-, Motor- und Getriebetemperaturen (LCD, LED Schema)
- GPS Daten aufzeichnen und evtl. anzeigen (LCD)
- Spritverbrauch & Reichweite anzeigen (LCD)
- Motor- & Kofferbatterieanzeige?
Erstmal informieren & Bauteile suchen =)
- Bauteile
- Temperatursensoren
- Durchflussmengen
- *** Conrad - 22,50
- GPS
- Neigungssensor
- [2] ,
Als Grundlage dient der bereits vorhandene Arduino Mega 2560 sowie ein Breadboard und diverse Kleinteile zum basteln. Ich werde mir jetzt im Internet die dafür notwendigen Bauteile besorgen und dann geht es weiter!
Digital mit dem DS18S20 via 1-Wire oder Analog? Wie fasse in ich den Sensor gut ein...hmmmm [3] [4]
Erster Einkauf:
- 2x Heissleiter B57703m103g40 10k - Conrad - 3,69€ - 7,38€
- 2x Temperatur-Sensor Pt1000 DIN 1/3 W-Eyk 6 - Conrad - 14,73€ - 29,46€
- 2x DS18S20 (Digital One wire)
Erste Versuche
Ich fang mit den DS18S20 als Temperatursensor an welcher mit One-Wire arbeitet, dafür muss ich die Arduino IDE um Library`s erweitern. Das heisst Library & DallasTemperature Library herunterladen und in das Arbeitsverzeichnis von Arduino entpacken. Dann bin ich auf fertige Sketche gestossen, das erste ermittelt die angeschlossenen DS18S20, das zweite kann diese dann auslesen. Danke an fluuux.de =)
Also los gehts, Breadboard ist wie folgt bestückt:
- 2x DS18S20 + 1x 4,7kOhm (Data an Pin2)
- 2x Led`s + 2x 220 Ohm (LED an Pin3,4)
Der folgende Entwurf soll die grüne LED solange leuchten lassen, solange die Temperatur 25°C überschreitet, wenn das der Fall ist soll die grüne ausgehen und die rote LED leuchten.
#include <OneWire.h> #include <DallasTemperature.h> // Pin Belegung OneWire ds(2); // Datenpin für DS18S20 int led1 = 3; // grün int led2 = 4; // gelb //DeviceAdressen DeviceAddress sensor1 = { 0x10, 0x0, 0x74, 0xB3, 0x2, 0x8, 0x0, 0xA9 }; DeviceAddress sensor2 = { 0x10, 0x19, 0xBD, 0xB4, 0x2, 0x8, 0x0, 0x33 }; // Sensor NBame für die Ausgabe auf dem Serial Monitor char sensor1Name[] = "Sensor1: "; char sensor2Name[] = "Sensor2: "; void setup(void) { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); } 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(1000); } 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]; //check for negative temperature if (data[1] > 0x80) { tr = !tr + 1; //two's complement adjustment tr = tr * -1; //flip value negative. } //COUNT PER Celsius degree (10h) int cpc = data[7]; //COUNT REMAIN (0Ch) int cr = data[6]; //drop bit 0 tr = tr >> 1; return tr - (float)0.25 + (cpc - cr)/(float)cpc; } void loop(void) { float temp1 = getTemperature(sensor1); float temp2 = getTemperature(sensor2); int temp1_int = getTemperature(sensor1); Serial.print(sensor1Name); Serial.print(temp1); Serial.println(" Celsius"); // Temperaturüberwachung led if (temp1_int > 25){ digitalWrite(led2, HIGH); // turn the LED off by making the voltage LOW digitalWrite(led1, LOW); // turn the LED off by making the voltage LOW } else{ digitalWrite(led2, LOW); // turn the LED off by making the voltage LOW digitalWrite(led1, HIGH); } // Erstmal nur als Referenz ohne LED Serial.print(sensor2Name); Serial.print(temp2); Serial.println(" Celsius"); Serial.println(); delay(1000); }