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.

lister

Neu Hier!

Beiträge: 3

Registrierungsdatum: 9. April 2018

  • Nachricht senden

21

Montag, 9. April 2018, 21:54

vielen Dank für die rasche Antwort. Gerade noch mal angemacht und jetzt steht der Wert ungefähr richtig da,
beim ziehen des NTC Sensors steht -273.15 da. Mach ich das ganze wieder aus und an, steht es wieder falsch da. :/
Hab den NTC Sensor durch ein neuen ersetzt und das selbe, mal richtig, mal falsch, komisch.
Denke der Arduino arbeiten nicht richtig, den Widerstand hab ich nachgemessen und er hat 4,68kΩ

Hier der Code, ich hab nur noch ein "delay(1000);" in der loop mit eingefügt, damit zwischen der Ausgabe auch eine Pause ist.

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
72
73
74
75
76
77
78
79
80
/*
Arduino Tutorial 5.1 - Temperaturmessung mit einem 10kO NTC Wiederstand

by Scynd 2015

In diesem Tutorial geht es darum, die Temperatur mit einem 10kO NTC zu messen.
*/


// 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 = 4700;     	// Wiederstand des NTC bei Nominaltemperatur
const int TempNominal = 25;       	// Temperatur bei der der NTC den angegebenen Wiederstand hat
const int BCoefficient = 3950;    	// Beta Coefficient(B25 aus Datenblatt des NTC)
const int SerienWiederstand = 4700;  // 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);         	// Setzt die Baudrate für die Ausgabe am Serial Monitor auf 9600
	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) {
		// speichert die Zeit der letzten Abfrage
		letzteMillis = aktuelleMillis;
		// Startet die Temperaturerfassungsroutine
		Temperaturberechnung();
	}

	// Ausgabe an den Seriellen Monitor
	Serial.print("Temperatur ");
	Serial.print(Temp);
	Serial.println(" *C");
	delay(1000);
}


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
}


+ 3 Bilder, im Fritzing Bild ist der falsche Widerstand, der ist natürlich nicht verbaut. ^^
»lister« hat folgende Bilder angehängt:
  • pic1.JPG
  • pic2.JPG
  • fritz.JPG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »lister« (9. April 2018, 22:12)


Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

22

Montag, 9. April 2018, 23:34

Sehr komisch ?(
Füg mal einen Serial.println wie hier in meinem Code ein. Mal sehen ob es an der Berechnung, am am Messen der Spannung oder am Aufbau liegt.
Theoretisch sollte da ein Wert von ca. 510 bei 25° rauskommen.

Quellcode

1
2
3
4
5
6
7
8
void Temperaturberechnung() {

	// Nimmt N Abfragen in einer Reihe, mit einem kurzen delay
	for (int i = 0; i < AbfrageZahl; i++) {
		Abfrage[i] = analogRead(NTC);
                Serial.println(Abfrage[i]);
                delay(10);
	}


lister

Neu Hier!

Beiträge: 3

Registrierungsdatum: 9. April 2018

  • Nachricht senden

23

Dienstag, 10. April 2018, 19:50

Neuer Tag und es bleibt weiter komisch, funktioniert und ich bekomme den Fehler nicht mehr reproduziert.
Nachdem ich gestern 3h damit verbracht hab, das ganze zum laufen zu bringen und dann mein Post gemacht hab,
weil ich mir dachte, es muss am NTC liegen.
Konnte ja nicht sein, das ich was falsch mach, Code downloaden, aufbauen und Werte einpflegen, fertig.
Hab jetzt ein Aduino von Elegoo aus meinem Starter-Kit von Amazon probiert, auch alles gut...

Hab das "Serial.println" eingefügt, er zeigt 535-536 bei 22,93-22,94 °C an, denke das sieht ganz gut aus.

Durch die gestrige Frage, "was passiert, wenn ich ein Widerstand ziehe", ist mir jetzt aufgefallen, es kommt das selbe Bild,
wie beim Fehler. Ich nutze zum Aufbau Steckbrücken und Male-Male Jumperkabel.
Bei dem Jumperkabel hatte ich schon ein defektes bei, weshalb ich schon recht am Anfang kurz vorm verzweifeln war, bei einem LED
Aufbau, bis ich auf das Kabel gestoßen bin. :dash:
Also geh ich einfach mal von einen Wackler im Kabel oder einer Brücke aus, dann wäre ja ein Widerstand nicht da und ich hab
das Bild, als würde ich ein Widerstand ziehen. :-)

Vielen vielen Danke für deine Hilfe und schnellen Antworten. :)

Eine Frage, hätte ich noch, ich nutze das Buch "Arduino Elektronik, Programmierung, Basteln" dort wird auch der NTC-Sensor
behandelt, leider war es mir mit meinem Datenblatt nicht möglich, das ganze richtig zu machen, weil dort mit den
Werten A, B, C, D gearbeitet wird, die ich nicht alle in meinem Datenblatt finden konnte, wie im Bsp. Datenblatt vom Sensor im Buch.
Daher ist die Lösung hier sehr cool :)
So zu meiner Frage ^^, im Buch wird auch die Spannung im Sketch berücksichtigt, meine beiden Arduinos geben jeweils gerade
4,84V aus, lag auch schon mal bei 4,5, statt die 5V, kann man das im Sketch noch berücksichtigen oder kann ich das vernachlässigen?
Versorge das jeweilige Arduino über ein USB Hub mit an/aus Schalter, das am PC angeschlossen ist.

Danke im Voraus.

Scynd

1. Platz Enermax Casecon Contest

  • »Scynd« ist der Autor dieses Themas

Beiträge: 924

Registrierungsdatum: 12. März 2012

Wohnort: München

Beruf: Maschinenbautechniker

Danksagungen: 74

  • Nachricht senden

24

Mittwoch, 11. April 2018, 10:47

Freut mich das ich helfen konnte ^^

Bezüglich deiner Frage zur Spannung.
Der Arduino benutzt eine Referenzspannung für die AnalogRead Funktion. Als Default nutzt er sie intern, also 5V. Ich denke (weiß aber nicht sicher), dass das die Versorgungsspannung ist.
Du kannst das überprüfen indem du den Vin Pin mit dem ARef Pin verbindest und im Setup Bereich das hier mit eingibst.

Quellcode

1
analogReference(EXTERNAL)


Wenn sich die ausgelesenen Werte ändern, dann wäre es mit der Externen Referenz genauer.

Siehe hier

Gruß Scynd


Es hat sich bereits 1 registrierter Benutzer bedankt.

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

lister (11.04.2018)