Sie sind nicht angemeldet.

[DIY How To Arduino] Arduino Tutorial 5 - Sensoren

Lieber Besucher, herzlich willkommen bei: We-Mod-It | Das Forum von Moddern für Modder. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

1

Mittwoch, 14. Januar 2015, 21:23

Arduino Tutorial 5 - Sensoren

Arduino Tutorial 5 - Sensoren



Vorwort


In diesen Tutorial widme ich mich den Sensoren, mit denen der Arduino etwas von seiner Umwelt erfährt und dementsprechend darauf reagieren kann. Ich beschränke mich dabei wieder auf Sensoren, die im Computer/Casemodding Bereich Sinn machen. Falls euch ein Sensor fehlt, sagt einfach bescheid, dann mache ich mich schlau und schreibe im Fall was dazu ;)


Teileliste

Arduino IDE (Tutorial wurde mit 1.6 erstellt)
Arduino UNO (Es gibt die Arduinos aber auch deutlich günstiger bei Ebay)
Breadboard
N-Chanel Transistor/Mosfet
12V Netzteil (das ist nur ein Beispiel! Bitte wählt ein ausreichend starkes Netzteil je nach Leistung die ihr benötigt)
alternativ 12V Computer Netzteil
10kO NTC-Widerstand (Temperatursensor)
DS18B20 Temperatursensor
Photowiderstand
Temic K153P Lichtschranke
4,7kO Widerstand
10kO Widerstand
100O Wiederstand





Inhaltsverzeichnis


5.1 - Temperaturmessung mit einem 10kO NTC Widerstand

5.2 - Temperaturmessung mit einem DS18B20

5.3 - Helligkeitsmessung mit einem Photowiderstand

5.4 - Lichtschranke




Ich wünsche euch viel Spaß bei Basteln! :thumbsup:

Dieser Beitrag wurde bereits 21 mal editiert, zuletzt von »Scynd« (12. März 2015, 12:34)


Es haben sich bereits 2 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

der_george (22.02.2015), Socke (23.02.2015)

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

2

Donnerstag, 15. Januar 2015, 10:06

5.1 - Temperaturmessung mit einem 10kO NTC Widerstand




NTC Widerstände, auch Thermistor genannt, ändern je nach Temperatur ihren Widerstandswert. Diese Änderung können wir nutzen um an einem Analog Input Eingang des Arduinos die Spannung zu messen. Der Arduino wandelt die anliegende analoge Spannung von 0V - 5V in einen digitalen Wert zwischen 0 - 1023 um, mit dem wir dann arbeiten können.
10kO NTCs werden üblicherweise im Luft- und Wasserkühlunsbereich eingesetzt, allerdings sitzen sie hier in Metallgehäusen .

Der Vorteil von Thermistoren sind ihr niedriger Preis und die Genauigkeit reicht für normale Belange aus.


Die Widerstandsänderung des Thermistors, sieht je nach Typ in etwa so aus.




Da sich der NTC Widerstand nicht linear verhält, müssen wir zur Temperaturberechnung die Steinhart-Hart-Gleichung verwenden.



Das sieht jetzt furchtbar kompliziert aus, aber keine Angst, ich erkläre die Variablen gleich im Code genauer ;)


Anschlussplan




Code

"AT_5_1.ino"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Konstanten
const long interval = 1000;           // Interval wie oft die Temperatur abgefragt wird (milliseunden)
const int abfrageZahl = 5;            // Je mehr abfragen, desto stabiler isr das Ergebnis, dauert aber länger
const int ntc = A0;                   // Pin für den 10kO NTC Wiederstand
const int ntcNominal = 10000;         // Wiederstand des NTC bei Nominaltemperatur
const int tempNominal = 25;           // Temperatur bei der der NTC den angegebenen Wiederstand hat
const int bCoefficient = 3977;        // Beta Coefficient(B25 aus Datenblatt des NTC)
const int serienWiederstand = 10000;  // Wert des Wiederstands der mit dem NTC in Serie geschalten ist

// Variablen
int abfrage[abfrageZahl];        // Array Variable für das Mitteln der Temperatur
float durchschnitt = 0;          // Variable für das Mitteln der Temperatur
float temp;                      // Variable für die Berechnung der temperatur nach Steinhart
unsigned long letzteMillis = 0;  // Speichert die letzte Zeit (millis) der Temperaturabfrage


void setup()
{  
  Serial.begin(9600);             // Baudrate für die Ausgabe am Serial Monitor
  pinMode(ntc, INPUT);            // Setzt den Pin des NTC Wiederstands als Eingang
}


void loop()
{
  // Erfasst die aktuelle Zeit für den Abfrageinterval
  unsigned long aktuelleMillis = millis();
  
  // Löst bei erreichen der Intervalzeit die Temperaturberechnung aus
  if(aktuelleMillis - letzteMillis >= interval) 
  {
    letzteMillis = aktuelleMillis;      // speichert die Zeit der letzten Abfrage
    Temperaturberechnung();             // Startet die Temperaturerfassungsroutine
    
    // Ausgabe an den Seriellen Monitor
    Serial.print("Temperatur ");
    Serial.print(temp);
    Serial.println(" *C");
  }
} 


void Temperaturberechnung()
{
  // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  for (int i=0; i < abfrageZahl; i++)
  {
    abfrage[i] = analogRead(ntc);
    delay(10);
  }
  
  // Mittelt alle Abfragen
  durchschnitt = 0;
  for (int i=0; i < abfrageZahl; i++)
  {
    durchschnitt += abfrage[i];
  }
  durchschnitt /= abfrageZahl;
  
  // Umwandlung des Wertes in Wiederstand
  durchschnitt = 1023 / durchschnitt - 1;
  durchschnitt = serienWiederstand / durchschnitt;
  
  // Umrechnung aller Ergebnisse in die Temperatur mittels einer Steinhard Berechnung
  temp = durchschnitt / ntcNominal;     // (R/Ro)
  temp = log(temp);                     // ln(R/Ro)
  temp /= bCoefficient;                 // 1/B * ln(R/Ro)
  temp += 1.0 / (tempNominal + 273.15); // + (1/To)
  temp = 1.0 / temp;                    // Invertieren
  temp -= 273.15;                       // Umwandeln in °C
}




Fangen wir mit den Konstanten an. Hier haben wir diesmal ein paar für die Berechnung wichtigen Werte, die ich jetzt erläutere.
  • ntcNominal = 10000 - Damit ist der Widerstand des NTC bei Nominaltemperatur gemeint. Dieser Wert wird immer im Namen schon angegeben. Ein 10kO NTC hat einen Widerstand von 10000 Ohm.
  • tempNominal = 25 - Das ist die Nominaltemperatur. Diese ist im Normalfall 25°.
  • bCoefficient = 3977 - Der Beta Coefficient ist eine Materialkonstante und ist im Datenblatt des NTC zu finden und wird mit B25 bezeichnet.
  • serienWiederstand = 10000 - Das ist der Wert in Ohm, des Widerstand, der zusammen mit dem NTC Widerstand verbaut wird. In unserem Fall auch ein 10kO Widerstand.
  • abfrageZahl = 5
  • abfrage[abfrageZahl]
abfrageZahl und abfrage hängen zusammen und bestimmen mit wie vielen Messwerten des NTC gemittelt wird. Je höher der Wert, desto weniger sprunghaft ist der Temperaturwert, allerdings dauert die Erfassung auch länger.


Der Code startet mit der Abfrage ob die im interval festgelegte Zeit (im Beispiel 1000 Millisekunden) erreicht ist. Wenn ja, startet die Temberaturberechnung()
Hier wird als erstes der NTC so oft ausgelesen und dessen Werte gespeichert wie mit AbfrageZahl festelegt ist.
Als nächstes werden die Werte zusammengezählt und durch abfrageZahl geteilt um den durchschnitt zu bilden.
Jetzt wird der durchschnitt in einen Widerstandswert umgerechnet. Ist das erledigt, wird die Temperatur mittels der Steinhart Formel berechnet.

Zurück im loop wird die Berechnete Temperatur in °C im Seriellen Monitor ausgegeben.


Das war es auch schon ^^



Hier noch der Download des Arduino Sketches

Dieser Beitrag wurde bereits 31 mal editiert, zuletzt von »Scynd« (22. Februar 2015, 20:48)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

3

Donnerstag, 15. Januar 2015, 13:11

5.2 - Temperaturmessung mit einem DS18B20



Der DS18B20 ist ein digitaler Tempertursensor mit einem Messbereich von -55°c - 125°C und einer Genauigkeit von +- 0,5°C, der über einen 1-Wire Bus angeschlossen wird.
Der Vorteil dieses Sensors ist sein relativ günstiger Preis (zwar teurer als ein NTC aber immer noch günstig), seine Genauigkeit und der Anschluss über den 1-Wire Bus, da man mehrere Temperatursensoren an nur einem einzigen Arduino Pin anschließen kann.
Ich werde als Beispiel drei DS18B20 anschließen, da das ja der Vorteil ist. Allerdings ändert sich der Code in meinem Beispiel nicht, egal wieviel Sensoren angeschlossen werden.
Um die DS18B20 ansprechen zu können, müssen vorher erst zwei Bibliotheken in die Arduino IDE eingebunden werden.
  1. OneWire Library von Paul Stoffregen --> DOWNLOAD
  2. Dallas Temperatur Control Library vom Miles Burton --> DOWNLOAD

Anschlussplan





Code


"AT_5_2.ino"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <OneWire.h>                  // OneWire-Bibliothek einbinden
#include <DallasTemperature.h>        // DS18B20-Bibliothek einbinden

// Konstanten
const int owPin = 2;                  // Pin für OneWire Bus definieren
const int interval = 1000;            // Interval wie oft die Temperatur abgefragt wird (milliseunden)

// Variablen
unsigned long letzteMillis = 0;       // Speichert die letzte Zeit (millis) der Temperaturabfrage

OneWire oneWire(owPin);               // OneWire Referenz setzen
DallasTemperature sensors(&oneWire);  // DS18B20 initialisieren


void setup()
{
  Serial.begin(9600);      // Baudrate für die Ausgabe am Serial Monitor
  sensors.begin();         // DS18B20 starten

  //Anzahl der angeschlossenen Sensoren ausgeben
  Serial.print("Sensoren: "); 
  Serial.println(sensors.getDeviceCount());
}


void loop()
{
  // Erfasst die aktuelle Zeit für den Abfrageinterval
  unsigned long aktuelleMillis = millis();
  
  // Löst bei erreichen der Intervalzeit die Temperaturerfassung aus
  if(aktuelleMillis - letzteMillis >= interval)
  {
    letzteMillis = aktuelleMillis;   // speichert die Zeit der letzten Abfrage
    sensors.requestTemperatures();   // Temperatursensoren auslesen
  
    // Temperaturen der Sensoren auslesen
    for(int i = 0; i < sensors.getDeviceCount(); i++)
    {    
      show_temperature(i + 1, sensors.getTempCByIndex(i));  
    }
  }	
}


// Temperatur am Seriellen Monitor ausgeben
void show_temperature(byte num,float temp)
{
  Serial.print("Sensor ");
  Serial.print(num);
  Serial.print(": ");
  Serial.print(temp);
  Serial.print(" ");       
  Serial.write(176);       // damit wird das °-Zeichen dargestellt
  Serial.println("C");
}




Als erstes werden die oben erwähnten Bibliotheken eingebunden, damit die Sensoren angesprochen werden können.
Merke: Ale Befehle die mit "sensors.***" anfangen, gehören zum Funktionsumfang der Bibliotheken und können bei Interesse auf den oben verlinkten Webseiten nachgeschlagen werden.


Kommen wir zu den wichtigen Konstanten und Bibliothekseinstellungen.
  • Interval legt fest, wie oft die Temperatur ausgelesen wird.
  • "OneWire oneWire(owPin)" und "DallasTemperature sensors(&oneWire)" werden von den beiden Bibliotheken benötigt

In void setup() werden mit sensors.begin(); die Temperatursensoren initialisiert. Zur Kontrolle lassen wir uns die Anzahl der erkannten Sensoren mit dem Befehl sensors.getDeviceCount(); im Seriellen Monitor ausgeben um eventuelle Fehler frühzeitig zu erkennen.
Im loop angekommen wird erst einmal abgefragt ob die Zeit von intervall erreicht wurde. Wenn ja, wird mit sensors.requestTemperatures(); die Temperatur der Sensoren ausgelesen.
In der folgenden for Schleife wird dann für jeden angeschlossenen Sensor die Befehlskette void show_temperature ausgeführt, in der die Temperatur am Seriellen Monitor ausgegeben wird.
Das war auch schon wieder alles ^^




Hier noch der Download des Arduino Sketches

Dieser Beitrag wurde bereits 22 mal editiert, zuletzt von »Scynd« (22. Februar 2015, 15:31)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

4

Freitag, 16. Januar 2015, 08:46

5.3 - Helligkeitsmessung mit einem Photowiderstand



Ein Fotowiderstand oder auch LDR genannt, ändert je nach Lichtstärke seinen Widerstandswert. Diese Änderung können wir nutzen um an einem Analog Input Eingang des Arduinos die Spannung zu messen. Der Arduino wandelt die anliegende analoge Spannung von 0V - 5V in einen digitalen Wert zwischen 0 - 1023 um, mit dem wir dann arbeiten können.
So kann man Beispielsweise einen Dämmerungsschalter bauen, oder die Beleuchtungsstärke seines Computers je nach Umgebungslicht automatisch steuern.


Anschlussplan





Code

"AT_5_3.ino"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Konstanten
const int abfrageZahl = 5;      // Je mehr abfragen, desto stabiler isr das Ergebnis
const int ldr = A0;             // Pin für den Fotowiederstand

// Variablen
int helligkeit = 0;            // Variable für die Helligkeit  
int abfrage[abfrageZahl];      // Array Variable für das Mitteln der Temperatur
float durchschnitt = 0;        // Variable für das Mitteln der Temperatur


void setup()
{  
  Serial.begin(9600);       // Baudrate für die Ausgabe am Serial Monitor
  pinMode(ldr, INPUT);      // Pin des NTC Wiederstands als Eingang
}


void loop()
{
  // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  for (int i=0; i < abfrageZahl; i++)
  {
    abfrage[i] = analogRead(ldr);
    delay(10);
  }
  
  // Mittelt alle Abfragen
  durchschnitt = 0;
  for (int i=0; i < abfrageZahl; i++)
  {
    durchschnitt += abfrage[i];
  }
  helligkeit = durchschnitt/abfrageZahl;
  
  // Ausgabe an den Seriellen Monitor
  Serial.print("LDR ");
  Serial.println(helligkeit);
}



abfrageZahl und abfrage hängen zusammen und bestimmen mit wie vielen Messwerten des LDR gemittelt wird. Je höher der Wert, desto weniger sprunghaft ist der Helligkeitsrwert, allerdings dauert die Erfassung auch länger.
Nachdem alle Variablen gesetzt und die Ein- und Ausgänge deklariert wurden, beginnt der Loop mit einer for Schleife in der 5 mal hintereinander der Helligkeitswert am Analogpin A0 gelesen wird.
In der nächsten for Schleife werden dann die fünf Ergebnisse in der Variable durchschnitt zusammengezählt und danach durch fünf geteilt um so eine gemittelte Messung zu erhalten. Das Ergebnis wird nun am Seriellen Monitor ausgegeben.


Das war auch schon wieder alles zu diesem Teil ;)


Wenn man nun Beispielsweise einen Dämmerungsschalter bauen möchte, muss eigentlich nur noch eine if Abfrage in den Code eingebaut werden und ein Pin als Ausgang deklariert werden.

"Dämmerungsschalter"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Konstanten
const int abfrageZahl = 5;      // Je mehr abfragen, desto stabiler isr das Ergebnis
const int ldr = A0;             // Pin für den Fotowiederstand
const int led = 2;

// Variablen
int helligkeit = 0;            // Variable für die Helligkeit  
int abfrage[abfrageZahl];      // Array Variable für das Mitteln der Temperatur
float durchschnitt = 0;        // Variable für das Mitteln der Temperatur


void setup()
{  
  Serial.begin(9600);       // Baudrate für die Ausgabe am Serial Monitor
  pinMode(ldr, INPUT);      // Pin des NTC Wiederstands als Eingang
  pinMode(led, OUTPUT);
}


void loop()
{
  // Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
  for (int i=0; i < abfrageZahl; i++)
  {
    abfrage[i] = analogRead(ldr);
    delay(10);
  }
  
  // Mittelt alle Abfragen
  durchschnitt = 0;
  for (int i=0; i < abfrageZahl; i++)
  {
    durchschnitt += abfrage[i];
  }
  helligkeit = durchschnitt/abfrageZahl;
  
  // Ausgabe an den Seriellen Monitor
  Serial.print("LDR ");
  Serial.println(helligkeit);
  
  // Schalte bei Dunkelheit die LED an
  if(helligkeit > 950)
  {
    digitalWrite(led, HIGH);
  }  
  else
  {
    digitalWrite(led, LOW);
  }  
}




Hier noch der Download des Arduino Sketches

Dieser Beitrag wurde bereits 22 mal editiert, zuletzt von »Scynd« (22. Februar 2015, 20:58)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

5

Freitag, 16. Januar 2015, 23:11


5.4 - Lichtschranke

Temic K153P


Mit einer Lichtschranke kann man erkennen, ob sich ein Objekt in einen bestimmten Bereich bewegt hat, indem er einen Lichtstrahl unterbricht. Diese Technik kommt z.B. als Endschalter oder Lageregelung zum Einsatz, oder um das Durchkommen von Teilen zu zählen.
Die Lichtschranke besteht aus einem Sender, der Licht erzeugt und einem Empfänger, der das einfallende Licht registriert und ein entsprechendes Signal ausgibt. Ich verwende für dieses Tutorial den Lichtschrankensatz Temic K153P , da er sehr günstig und leicht zu bekommen ist. Er besteht aus einer IR-Sendediode(blau) die nichts anderes als eine Infrarot LED ist und einem Fototransistor (schwarz).
Ich gehe hier auf zwei Anwendungsfälle ein, bzw. auf verscheiden große Abstände von Sender und Empfängen.






5.4.1 - Lichtschranke nah


Bei dieser Konfiguration stehen Sender und Empfänger ca. 5 -10mm von einander entfernt. Hier liefert der Fototransistor an einem digitalen Pin ein HIGH Signal für eine nicht unterbrochene und ein LOW Signal, für eine unterbrochene Lichtschranke.


Anschlussplan

Der Fototransistor ist in der Zeichnung Weiß statt Schwarz, das hat aber nichts zu bedeuten.



Code

"AT_5_4_1.ino"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Konstanten
const int empfPin = 2;      // Pin des Empfängers
const int ledPin = 13;      // LED auf dem Arduino initialisieren

// Variablen
int signal = 0;


void setup()
{  
  pinMode(empfPin, INPUT);      // Pin des Senders als Eingang
  pinMode(ledPin, OUTPUT);      // Pin der LED als Ausgang
}


void loop()
{
// Lichtschrankenstatus in Variable speichern
  signal = digitalRead(empfPin);
  
  // Wenn Lichtschranke unterbrochen wird, geht die LED an
  if(signal == HIGH)
  {
    digitalWrite(ledPin, HIGH);
  }   
  else
  {
    digitalWrite(ledPin, LOW);
  }
}




Nach dem setzen der Konstanten und Variablen, werden im setup noch die Ein- und Ausgänge deklariert.
Der loop beginnt mit dem auslesen des Fototransistors. Dazu wird der Status des empfPin in der Variable signal gespeichert. Nun wird per if Abfrage geprüft ob signal HIGH ist. Wenn das zutrifft, sprich wenn die Lichtschranke unterbrochen ist, wird die LED auf dem Arduino angesteuert und leuchtet.
Wenn das signal LOW ist, bleibt die LED aus.





5.4.2 - Lichtschranke fern



Bei dieser Konfiguration stehen Sender und Empfänger ca. 60mm von einander entfernt (mehr oder weniger Abstand müsst ihr testen). Hier liefert der Fototransistor an einem Analogen Pin einen Wert zwischen 0 und 1023, je nach Abstand und Unterbrechung der Lichtschranke.


Anschlussplan

Der Fototransistor ist in der Zeichnung Weiß statt Schwarz, das hat aber nichts zu bedeuten



Code

"AT_5_4_2.ino"


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Konstanten
const int empfPin = A1;       // Pin des Empfängers
const int ledPin = 13;        // LED auf dem Arduino initialisieren

// Variablen
int signal = 0;


void setup()
{  
  Serial.begin(9600);           // Baudrate für die Ausgabe am Serial Monitor
  pinMode(empfPin, INPUT);      // Pin des Senders als Eingang
  pinMode(ledPin, OUTPUT);      // Pin der LED als Ausgang
}


void loop()
{
// Lichtschrankenstatus in Variable speichern
  signal = analogRead(empfPin);
  
  // Wenn Lichtschranke unterbrochen wird, geht die LED an
  if(signal > 900)
  {
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }
  
  // Zur Kontrolle an den Seriellen Monitor senden
  Serial.println(signal);
}




Nach dem setzen der Konstanten und Variablen, werden im setup noch die Ein- und Ausgänge deklariert.
Der loop beginnt mit dem auslesen des Fototransistors. Im Gegensatze zum ersten Teil, lesen wir hier per analogRead aus, da wegen des großen Abstandes von Sender und Empfänger kein sauberes HIGH oder LOW Signal mehr zustande kommt, sondern ein Wert zwischen 0 und 1023, ja nach Abstand. Dazu wird der Wert des empfPin in der Variable signal gespeichert.
Nun wird per if Abfrage geprüft ob signal größer als 900 ist (diesen Wert habe ich durch probieren und auslesen am Seriellen Monitor herausbekommen). Wenn das zutrifft, sprich wenn die Lichtschranke unterbrochen ist, wird die LED auf dem Arduino angesteuert und leuchtet.
Wenn das signal kleiner 900 ist ist, bleibt die LED aus.


Das war auch schon wieder alles zu diesem Teil ;)




Hier noch der Download des Arduino Sketches



Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von »Scynd« (12. März 2015, 12:47)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

6

Freitag, 20. Februar 2015, 10:39

Platzhalter 2 für evtl. kommende Sensoren


der_george

"Mein Name ist George - Der George"

Beiträge: 4 679

Registrierungsdatum: 17. März 2010

Wohnort: Da wo der Berch wohnt

Beruf: Inginöööör und Freundinbeschäftiger

Danksagungen: 350

  • Nachricht senden

7

Sonntag, 22. Februar 2015, 23:34

So - das HowTo auf Wunsch verschoben.

Wieder mal ein sau gutes HowTo von dir! Dank dir für deine Mühen!

So long:0)
Meine Mods bei we-mod-it:
24h Stealth - 1.Platz 24h Livemodding DCMM 2010 | | taabar sin - 2. Platz Casemod DCMM 2012 | | 24h Semmetastic - 2. Platz 24h Livemodding DCMM 2013

Mein Modding-Verkaufsthread

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

8

Donnerstag, 12. März 2015, 13:05

Platzhalter 3 für evtl. kommende Sensoren und Push ;)


der_george

"Mein Name ist George - Der George"

Beiträge: 4 679

Registrierungsdatum: 17. März 2010

Wohnort: Da wo der Berch wohnt

Beruf: Inginöööör und Freundinbeschäftiger

Danksagungen: 350

  • Nachricht senden

9

Donnerstag, 12. März 2015, 19:21

:thumbsup:

Schön wie immer! :phat:

So long :0)
Meine Mods bei we-mod-it:
24h Stealth - 1.Platz 24h Livemodding DCMM 2010 | | taabar sin - 2. Platz Casemod DCMM 2012 | | 24h Semmetastic - 2. Platz 24h Livemodding DCMM 2013

Mein Modding-Verkaufsthread

rootable

Neu Hier!

Beiträge: 4

Registrierungsdatum: 27. April 2015

  • Nachricht senden

10

Montag, 4. Mai 2015, 15:28

Ich habe mal eine Frage zu der Geschichte mit den DS18B20:
Was bestimmt denn die Reihenfolge beim Initialisieren? Also wie kann ich im Code später die Werte der Sensoren ihrem "Ort" zuordnen?
Angenommen ich habe 5 Sensoren an den Bus angeschlossen....

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

11

Montag, 4. Mai 2015, 21:14

Hi rootable,
so genau kann ich dir das gar nicht sagen, da das alles Funktionen der Libraries sind.
Jeder DS18B20 hat eine eindeutige ID (Hex Wert) der in den befehlen der Library ausgelesen wird. In welcher Reihenfolge sie dann die Sensor Nummern 1 - ... vergibt weiß ich nciht, es sollte aber immer einem bestimmten Sensor die gleiche Nummer zugeordnet werden.
Am besten du erwärmst einen Sensor nach dem anderen und kennzeichnest ihn mit seiner Nummer. Besser kann ich dir leider auf die Schnelle nicht weiterhelfen. Da brauche ich mal etwas Zeit um mich mit diesem Problem näher auseinander zu setzen.

Gruß Scynd


Flexplays

Neu Hier!

Beiträge: 443

Registrierungsdatum: 1. November 2014

Name: Jonathan

Wohnort: in der Nähe von Stuttgart

Danksagungen: 20

  • Nachricht senden

12

Donnerstag, 30. März 2017, 19:21

Cooles Tutorial :thumbup: .
Jaaa,ich weiß, der Thread ist schon recht alt, ich habe allerdings eine Frage zum Output am Ende.

Und zwar sollen bei meinem Arduino Pro Micro am Ende anstatt des normalen Outputs mit dem Display die Ports 2-9 Spannung ausgeben oder nicht, je nachdem, wie hoch bzw. niedrig die Temperatur ist.
Hier die "Code" Tabelle für den Output ^^:

Das ganze soll dann von Pin 2-5 (A-D) für die Dezimalstelle sein und von Pin 6-9 (A-D) für die Stelle dahinter. Ich hoffe, du verstehst was ich meine ^^.

Ich habe erst seit kurzem mit Arduino angefangen, deshalb habe ich eigentlich nicht wirklich viel Ahnung von Arduino programmieren :lol: .

Gruß, Flexplays
Projekt Reforged

sponsored by

and


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

13

Freitag, 31. März 2017, 08:29

Hi Flexplays, gib mir mal bitte etwas Hintergrundinfo was du vor hast, dann kann ich besser helfen. Liest du eine Temperatur aus, die du dann nach der Tabelle quasi ausgeben willst?


Flexplays

Neu Hier!

Beiträge: 443

Registrierungsdatum: 1. November 2014

Name: Jonathan

Wohnort: in der Nähe von Stuttgart

Danksagungen: 20

  • Nachricht senden

14

Freitag, 31. März 2017, 09:43

Ja, genau. Der Sensor ist bei mir am pin A0 angeschlossen und das Arduino soll dann den Wert auslesen und mit Hilfe der Tabelle dann den Wert anzeigen :).
Die Schaltung ist für mein Nixie Thermometer, deswegen die Tabelle ^^
Projekt Reforged

sponsored by

and


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

15

Samstag, 1. April 2017, 20:41

Noch eine Verständnisfrage.
Du hast 3 Nixis oder? Zwei für die Stellen vor dem Komma und eine für die Stelle nach dem Komma, oder? Ich bin nur verwirrt, weil du oben nur 8 Pins genannt hast und nicht 12. Eine Stelle vor dem Komma macht doch wenig Sinn bei ner Temperatur zwischen ~20 und ~90°C.


Flexplays

Neu Hier!

Beiträge: 443

Registrierungsdatum: 1. November 2014

Name: Jonathan

Wohnort: in der Nähe von Stuttgart

Danksagungen: 20

  • Nachricht senden

16

Sonntag, 2. April 2017, 09:07

Nee, ich habe zwei Nixies für die Temperatur. Eine für die dezimal stelle und eine für die einser stelle. Hinterm komma hab ich nichts :).
Projekt Reforged

sponsored by

and


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 794

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 56

  • Nachricht senden

17

Sonntag, 2. April 2017, 20:59

Achsoooo, dann hab ich das falsch verstanden :rolleyes:
Das macht das ganze dann "etwas" leichter. Du musst das im Endeffekt so aufbauen...

Angenommen die Temperatuer sind 68°C.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if (temp >= 60 && temp < 70) {
   // Ausgabe für 10er Stelle
   digitalWrite(A, LOW);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, LOW);

   // Ausgabe 1er Stelle
   temp = temp - 60;   // Dann bleibt nur die 1er Stelle, also 8 übrig
   sitch (temp) {
  	case 0: {
     	digitalWrite(A, LOW);
     	digitalWrite(B, LOW);
     	digitalWrite(C, LOW);
     	digitalWrite(D, LOW);
     	break;
  	}
  	case 1: {
     	digitalWrite(A, HIGH);
     	digitalWrite(B, LOW);
     	digitalWrite(C, LOW);
     	digitalWrite(D, LOW);
     	break;
  	}
  	case 2: {
     	digitalWrite(A, LOW);
     	digitalWrite(B, HIGH);
     	digitalWrite(C, LOW);
     	digitalWrite(D, LOW);
     	break;
  	}
 	usw.......


Das musst du halt für jede 10er Stelle machen, dann sollte es eigentlich klappen. Ich weiß nicht ob und wann ich nächste Woche mal Zeit habe, da eine ordentlich Funktion daraus zu stricken, aber wenn du nicht klar kommst, setze ich mich mal dran ;)

Gruß Scynd


Es hat sich bereits 1 registrierter Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Flexplays (02.04.2017)

Flexplays

Neu Hier!

Beiträge: 443

Registrierungsdatum: 1. November 2014

Name: Jonathan

Wohnort: in der Nähe von Stuttgart

Danksagungen: 20

  • Nachricht senden

18

Sonntag, 2. April 2017, 21:05

Perfekt, vielen Dank :thumbsup: . Damit kann ich auf jeden Fall was anfangen ^^ .
Werde mir mal was überlegen und es dann hier rein schreiben, falls das sonst noch jemand gebrauchen könnte :thumbup: .
Momentan kann ich das Arduino zwar noch nicht anschließen (weil die Platinen noch fehlen :wacko: ), aber das ist ja erstmal nicht so schlimm.

Gruß, Flexplays
Projekt Reforged

sponsored by

and