KY-013 Temperatur-Sensor Modul: Unterschied zwischen den Versionen

Aus SensorKit X40 Wiki

Wechseln zu: Navigation, Suche
(Codebeispiel Raspberry Pi)
(Codebeispiel Raspberry Pi)
Zeile 186: Zeile 186:
 
Das Programm misst mit Hilfe des ADS1115 ADC den aktuellen Spannungswert am ADC, berechnet daraus den aktuellen Widerstand des NTC, berechnet mit Hilfe vorab für diesen Sensor bestimmter Werte die Temperatur und gibt diese in die Konsole aus.
 
Das Programm misst mit Hilfe des ADS1115 ADC den aktuellen Spannungswert am ADC, berechnet daraus den aktuellen Widerstand des NTC, berechnet mit Hilfe vorab für diesen Sensor bestimmter Werte die Temperatur und gibt diese in die Konsole aus.
  
<pre class="brush:py"># coding=utf-8
+
<pre>#!/usr/bin/python
#!/usr/bin/python
+
# coding=utf-8
 
+
 
+
 
#############################################################################################################
 
#############################################################################################################
 
### Copyright by Joy-IT
 
### Copyright by Joy-IT
Zeile 195: Zeile 194:
 
### Commercial use only after permission is requested and granted
 
### Commercial use only after permission is requested and granted
 
###
 
###
### KY-013 Temperatur Sensor - Raspberry Pi Python Code Example
+
### KY-053 Analog Digital Converter - Raspberry Pi Python Code Example
 
###
 
###
 
#############################################################################################################
 
#############################################################################################################
 +
import time
 +
import board
 +
import busio
 +
import adafruit_ads1x15.ads1115 as ADS
 +
from adafruit_ads1x15.analog_in import AnalogIn
 +
import math
 +
# Create the I2C bus
 +
i2c = busio.I2C(board.SCL, board.SDA)
  
 
+
# Create the ADC object using the I2C bus
# Dieser Code nutzt die ADS1115 und die I2C Python Library fuer den Raspberry Pi
+
ads = ADS.ADS1115(i2c)
# Diese ist unter folgendem Link unter der BSD Lizenz veroeffentlicht
+
voltageMax = 3.3
# [https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code]
+
# Create single-ended input on channels
import Adafruit_ADS1x15
+
chan0 = AnalogIn(ads, ADS.P0)
from time import sleep
+
chan1 = AnalogIn(ads, ADS.P1)
 
+
chan2 = AnalogIn(ads, ADS.P2)
# Weitere benoetigte Module werden importiert und eingerichtet
+
chan3 = AnalogIn(ads, ADS.P3)
import time, signal, sys, os, math
+
import RPi.GPIO as GPIO
+
GPIO.setmode(GPIO.BCM)
+
GPIO.setwarnings(False)
+
 
+
# Benutzte Variablen werden initialisiert
+
delayTime = 0.2
+
 
+
# Adresszuweisung ADS1x15 ADC
+
 
+
ADS1015 = 0x00  # 12-bit ADC
+
ADS1115 = 0x01  # 16-bit
+
 
+
# Verstaerkung (Gain) wird ausgewaehlt
+
gain = 1  # +/- 4.096V
+
# gain = 2048  # +/- 2.048V
+
# gain = 1024  # +/- 1.024V
+
# gain = 512  # +/- 0.512V
+
# gain = 256  # +/- 0.256V
+
 
+
# Abtasterate des ADC (SampleRate) wird ausgewaehlt
+
# sps = 8    # 8 Samples pro Sekunde
+
# sps = 16  # 16 Samples pro Sekunde
+
# sps = 32  # 32 Samples pro Sekunde
+
# sps = 64  # 64 Samples pro Sekunde
+
# sps = 128  # 128 Samples pro Sekunde
+
# sps = 250  # 250 Samples pro Sekunde
+
# sps = 475  # 475 Samples pro Sekunde
+
sps = 860  # 860 Samples pro Sekunde
+
 
+
# ADC-Channel (1-4) wird ausgewaehlt
+
adc_channel = 0    # Channel 0
+
# adc_channel = 1    # Channel 1
+
# adc_channel = 2    # Channel 2
+
# adc_channel = 3   # Channel 3
+
 
+
# Hier wird der ADC initialisiert - beim KY-053 verwendeten ADC handelt es sich um einen ADS1115 Chipsatz
+
adc = Adafruit_ADS1x15.ADS1115()
+
 
+
#############################################################################################################
+
 
+
# ########
+
# Hauptprogrammschleife
+
# ########
+
# Das Programm misst mit Hilfe des ADS1115 ADC den aktuellen Spannungswert am ADC,
+
# berechnet daraus den aktuellen Widerstand des NTC, berechnet mit Hilfe vorab für diesen Sensor bestimmter Werte
+
# die Temperatur und gibt diese in die Konsole aus
+
 
+
try:
+
        while True:
+
                #Aktuelle Werte werden aufgenommen...
+
                voltage = adc.read_adc(adc_channel, gain, sps)
+
                # ... umgerechnet ...
+
                temperatur = math.log((10000/voltage)*(3300-voltage))
+
                temperatur = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temperatur * temperatur)) * temperatur);
+
                temperatur = temperatur - 273.15;
+
                # ... und ausgegeben
+
                print ("Temperatur:", temperatur,"°C")
+
                print ("---------------------------------------")
+
 
+
                # Delay
+
                time.sleep(delayTime)
+
 
+
  
  
except KeyboardInterrupt:
 
        GPIO.cleanup()
 
  
</pre>
+
while True:
 +
    temperatur = math.log((10000/chan0.voltage)*(3.3-chan0.voltage))
 +
    temperatur = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temperatur * temperatur)) * temperatur);
 +
    temperatur = temperatur - 273.15   
 +
    print("Temperatur: ",'%.2f' % temperatur,"°C")
 +
    print("---------------------------------------------------")
 +
    time.sleep(1)</pre>
 
'''Anschlussbelegung Raspberry Pi:'''
 
'''Anschlussbelegung Raspberry Pi:'''
  

Version vom 5. Dezember 2018, 13:38 Uhr

Bild

ky-013.jpg

Technische Daten / Kurzbeschreibung

Temperaturmessbereich: -55°C / +125°C


Dieses Modul beinhaltet einen NTC Thermistor—dieser hat bei höherer Temperatur einen immer weniger werdenden Widerstandswert.

KY-013 NTC-Kurve.png

Diese Änderung des Widerstands lässt sich mathematisch annähern und in einen linearen Verlauf umrechnen und den Temperaturkoeffizienten (Abhängigkeit von Widerstandsänderung zur Temperaturänderung) bestimmen. Mittels diesen lässt sich somit dann immer die aktuelle Temperatur errechnen, wenn man den aktuellen Widerstand kennt.


Dieser Widerstand lässt sich mit Hilfe eines Spannungsteilers bestimmen, wo sich eine bekannte Spannung über einen bekannten und einen unbekannten (veränderlichen) Widerstand aufteilt. Mittels dieser gemessenen Spannung lässt sich dann der Widerstand berechnen - die genaue Berechnung ist in den unten stehenden Codebeispielen enthalten.

KY-013 VoltDivide.jpg


Pin-Belegung

3 V G S.png

Codebeispiel Arduino

Das Programm misst den aktuellen Spannungswert am NTC, berechnet die Temperatur und übersetzt das Ergebnis in °C für die serielle Ausgabe

#include <math.h>

int sensorPin = A5; // Hier wird der Eingangs-Pin deklariert

// Diese Funktion übersetzt den aufgenommenen analogen Messwert
// in die entsprechende Temperatur in °C und gibt diesen aus
double Thermistor(int RawADC)
{
	double Temp;
	Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
	Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
	Temp = Temp - 273.15;            // Konvertierung von Kelvin in Celsius
	return Temp;
}

// Serielle Ausgabe in 9600 Baud
void setup()
{
	Serial.begin(9600);
}

// Das Programm misst den aktuellen Spannungswert am NTC
// und übersetzt das Ergebnis in °C für die serielle Ausgabe
void loop()
{
	int readVal = analogRead(sensorPin);
	double temp =  Thermistor(readVal);

	// Ausgabe auf die serielle Schnittstelle
	Serial.print("Aktuelle Temperatur ist:");
	Serial.print(temp); 
        Serial.print(char(186)); //Ausgabe <°> Symbol
	Serial.println("C");
	Serial.println("---------------------------------------");

	delay(500);
}

Anschlussbelegung Arduino:

Sensor +V = [Pin 5V]
Sensor GND = [Pin GND]
Sensor Signal = [Pin A5]

Beispielprogramm Download

KY-013_TemperaturSensor.zip

Bild

ky-013.jpg

Technische Daten / Kurzbeschreibung

Temperaturmessbereich: -55°C / +125°C


Dieses Modul beinhaltet einen NTC Thermistor—dieser hat bei höherer Temperatur einen immer weniger werdenden Widerstandswert.

KY-013 NTC-Kurve.png

Diese Änderung des Widerstands lässt sich mathematisch annähern und in einen linearen Verlauf umrechnen und den Temperaturkoeffizienten (Abhängigkeit von Widerstandsänderung zur Temperaturänderung) bestimmen. Mittels diesen lässt sich somit dann immer die aktuelle Temperatur errechnen, wenn man den aktuellen Widerstand kennt.


Dieser Widerstand lässt sich mit Hilfe eines Spannungsteilers bestimmen, wo sich eine bekannte Spannung über einen bekannten und einen unbekannten (veränderlichen) Widerstand aufteilt. Mittels dieser gemessenen Spannung lässt sich dann der Widerstand berechnen - die genaue Berechnung ist in den unten stehenden Codebeispielen enthalten.

KY-013 VoltDivide.jpg


Pin-Belegung

3 V G S.png

Codebeispiel Arduino

Das Programm misst den aktuellen Spannungswert am NTC, berechnet die Temperatur und übersetzt das Ergebnis in °C für die serielle Ausgabe

#include 

int sensorPin = A5; // Hier wird der Eingangs-Pin deklariert

// Diese Funktion übersetzt den aufgenommenen analogen Messwert
// in die entsprechende Temperatur in °C und gibt diesen aus
double Thermistor(int RawADC)
{
	double Temp;
	Temp = log(10000.0 * ((1024.0 / RawADC - 1)));
	Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
	Temp = Temp - 273.15;            // Konvertierung von Kelvin in Celsius
	return Temp;
}

// Serielle Ausgabe in 9600 Baud
void setup()
{
	Serial.begin(9600);
}

// Das Programm misst den aktuellen Spannungswert am NTC
// und übersetzt das Ergebnis in °C für die serielle Ausgabe
void loop()
{
	int readVal = analogRead(sensorPin);
	double temp =  Thermistor(readVal);

	// Ausgabe auf die serielle Schnittstelle
	Serial.print("Aktuelle Temperatur ist:");
	Serial.print(temp); 
        Serial.print(char(186)); //Ausgabe <°> Symbol
	Serial.println("C");
	Serial.println("---------------------------------------");

	delay(500);
}

Anschlussbelegung Arduino:

Sensor +V = [Pin 5V]
Sensor GND = [Pin GND]
Sensor Signal = [Pin A5]

Beispielprogramm Download

KY-013_TemperaturSensor.zip

Codebeispiel Raspberry Pi

!! Achtung !! Analoger Sensor  !! Achtung !!

Der Raspberry Pi besitzt im Gegensatz zum Arduino keine analogen Eingänge bzw. es ist kein ADC (analog digital Converter) im Chip des Raspberry Pi's integriert. Dies schränkt den Raspberry Pi ein, wenn man Sensoren einsetzen möchte, wo nicht digital Werte ausgegeben werden [Spannungswert überschritten -> digital EIN | Spannungswert unterschritten -> digital AUS | Beispiel: Knopf gedrückt [EIN] Knopf losgelassen [AUS]], sondern es sich hier um einen kontinuierlichen veränderlichen Wert handeln sollte (Beispiel: Potentiometer -> Andere Position = Anderer Spannungswert)

Um diese Problematik zu umgehen, besitzt unser Sensorkit X40 mit dem KY-053 ein Modul mit 16 Bit genauen ADC, welches Sie am Raspberry nutzen können, um diesen um 4 analoge Eingänge erweitern zu können. Dieses wird per I2C an den Raspberry Pi angeschlossen, übernimmt die analoge Messung und gibt den Wert digital an den Raspberry Pi weiter.

Somit empfehlen wir, bei analogen Sensoren dieses Sets das KY-053 Modul mit dem besagten ADC dazwischenzuschalten. Nähere Informationen finden Sie auf der Informationsseite zum KY-053   Analog Digital Converter

!! Achtung !! Analoger Sensor  !! Achtung !!

Das Programm nutzt zur Ansteuerung des ADS1115 ADC die entsprechenden ADS1x15 und I2C Python-Libraries der Firma Adafruit. Diese wurden unter dem folgenden Link https://github.com/adafruit/Adafruit_CircuitPython_ADS1x15] unter der MIT-Lizenz Link] veröffentlicht. Die benötigten Libraries sind im unteren Download-Paket enthalten.

Das Programm misst mit Hilfe des ADS1115 ADC den aktuellen Spannungswert am ADC, berechnet daraus den aktuellen Widerstand des NTC, berechnet mit Hilfe vorab für diesen Sensor bestimmter Werte die Temperatur und gibt diese in die Konsole aus.

#!/usr/bin/python
# coding=utf-8
 
#############################################################################################################
### Copyright by Joy-IT
### Published under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
### Commercial use only after permission is requested and granted
###
### KY-053 Analog Digital Converter - Raspberry Pi Python Code Example
###
#############################################################################################################
import time
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
import math
# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)

# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)
voltageMax = 3.3
# Create single-ended input on channels
chan0 = AnalogIn(ads, ADS.P0)
chan1 = AnalogIn(ads, ADS.P1)
chan2 = AnalogIn(ads, ADS.P2)
chan3 = AnalogIn(ads, ADS.P3)



while True:
    temperatur = math.log((10000/chan0.voltage)*(3.3-chan0.voltage))
    temperatur = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temperatur * temperatur)) * temperatur);
    temperatur = temperatur - 273.15    
    print("Temperatur: ",'%.2f' % temperatur,"°C")
    print("---------------------------------------------------")
    time.sleep(1)

Anschlussbelegung Raspberry Pi:

Sensor

+V = 3,3V [Pin 1 (RPi)]
GND = Masse [Pin 06 (RPi)]
analoges Signal = Analog 0 [Pin A0 (ADS1115 - KY-053)]

ADS1115 - KY-053:

VDD = 3,3V [Pin 17]
GND = Masse [Pin 09]
SCL = GPIO03 / SCL [Pin 05]
SDA = GPIO02 / SDA [Pin 03]
A0 = s.o. [Sensor: analoges Signal]

Beispielprogramm Download

KY-013_RPi_TemperaturSensor.zip

Zu starten mit dem Befehl:

sudo python3 KY-013_RPi_TemperaturSensor.py