You are not logged in.

[DIY How To Arduino] Arduino Tutorial 5 - Sensoren

Dear visitor, welcome to We-Mod-It | Das Forum von Moddern für Modder. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

lister

Neu Hier!

Posts: 3

Date of registration: Apr 9th 2018

  • Send private message

21

Monday, April 9th 2018, 9:54pm

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.

Source code

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 has attached the following images:
  • pic1.JPG
  • pic2.JPG
  • fritz.JPG

This post has been edited 1 times, last edit by "lister" (Apr 9th 2018, 10:12pm)


Scynd

1. Platz Enermax Casecon Contest

  • "Scynd" started this thread

Posts: 915

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

22

Monday, April 9th 2018, 11:34pm

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.

Source code

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!

Posts: 3

Date of registration: Apr 9th 2018

  • Send private message

23

Tuesday, April 10th 2018, 7:50pm

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" started this thread

Posts: 915

Date of registration: Mar 12th 2012

Location: München

Occupation: Maschinenbautechniker

Thanks: 74

  • Send private message

24

Wednesday, April 11th 2018, 10:47am

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.

Source code

1
analogReference(EXTERNAL)


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

Siehe hier

Gruß Scynd


1 registered user thanked already.

Users who thanked for this post:

lister (11.04.2018)