Unimik

Aus d0b
Zur Navigation springenZur Suche springen


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 =)

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)

Erster Versuch

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 One-Wire & 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);   
    digitalWrite(led1, LOW);   
  }
  else{
    digitalWrite(led2, LOW);    
    digitalWrite(led1, HIGH); 
  }
  
  // 2.Temp nur als Referenz ohne LED auf Serial ausgeben
  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" Celsius");
 
  Serial.println();
  delay(1000);
}

Das ging schnell, jetzt noch die anderen Sensoren kaufen und weiter gehts, bin mir noch unschlüssig wie groß das display werden soll :/

Einkauf

Weiter geht es mit dem Einkauf der verschiednen Bauteile.

Implementierung

Um das Projekt später einfach erweitern zu können, habe ich -sofern nötig- für jeden Sensor eine kleine Library geschrieben.

  • FlowSensor.h

Um den Flowsensor betreiben zu können muss in SoftwareSerial.cpp Zeile 229-231 auskommentiert werden.

//#if defined(PCINT2_vect)
//ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect));
//#endif
 
    • (GIT-HUB Link)
    • Anwendung:
      • Die Signalleitung kann an die Pin's A8-A15 angeschlossen werden
      • Rote Leitung an +5V
      • Schwarze Leitung an GND
      • Erstellen eines FlowSensor Objekts mittels "FlowSensor BenzinFluss(Hier den verwendeten Pin angeben Bsp: 8)"
      • Nun kann über BenzinFluss.getFlow() der gemittelte Durchfluss pro Stunde seit dem letzten Funktionsaufruf abgefragt werden

Links