Wissensdatenbank
Buehl, Kevin
06 Juni 2016
3.809

Wissensdatenbank

Raspberry Pi Feuchtigkeitsmesser für Pflanzen mit MCP3008

Inhaltsverzeichnis

Vorwort

Wer hat es nicht gerne einfach? Aus diesem Grund möchte ich die Erdfeuchtigkeit meiner Pflanzen messen.

Hardware

MCP3008 Raspberry PiMCP3008 Raspberry Pi

MCP3008 Raspberry Pi


- Soil Humidity Sensor Module (für jede Pflanze einen)
-
Dieser Link wurde entfernt. Links sind nur für Mitglieder sichtbar. Bitte melden Sie sich mit Ihrem Benutzernamen und Ihrem Passwort an und versuchen Sie es erneut.


Schliessen Sie den MCP3008 wie rechts zu sehen an Ihren Rasperry Pi an. Die Pins für 3,3 Volt und Masse (GND) können zu jeweils einen Pin zusammen geführt werden.



Skript

MCP3008 MonitoringMCP3008 Monitoring

MCP3008 Monitoring


Anbei finden Sie mein Skript, welches die analog Werte der einzelnen Kanäle ausliest.
nano /usr/lib/nagios/plugins/check_mcp3008.py
#!/usr/bin/python
#-----------------------------------------------------------------------#
# Copyright 2006-2016 by Kevin Buehl <kevin@buehl.biz> #
#-----------------------------------------------------------------------#
# __ __ _____________ __ __ ______________ #
# | | 2006 | | | _______ \ | | | | |___________ | #
# | | 2016 | | | | \ | | | | | | | #
# | |___ ____| | | |_______/ / | |___ ____| | ___________| | #
# |______ ____ | | _______ | |______ ____ | | ___________| #
# by | | | | \ \ Content | | | | #
# Kevin | | | |_______/ | Management | | | |___________ #
# Buehl |__| |_____________/ System |__| |______________| #
# #
# No part of this website or any of its contents may be reproduced, #
# copied, modified or adapted, without the prior written consent of #
# the author, unless otherwise indicated for stand-alone materials. #
# For more Information visit www.4b42.com. #
# This notice must be untouched at all times. #
#-----------------------------------------------------------------------#

#-----------------------------------------------------------------------#
# 2016-05-15 Kevin Buehl created
#-----------------------------------------------------------------------#
# get arguments from command line
import sys, getopt
myopts, args = getopt.getopt(sys.argv[1:],"i:w:c:")
chan=0
warn=0
crit=0
for o, a in myopts:
if o == '-i':
chan=int(a)
elif o == '-w':
warn=int(a)
elif o == '-c':
crit=int(a)
else:
print("Usage: %s -i <channel> -w <warning> -c <critical>" % sys.argv[0])

#Python Timerklasse importieren
import time
#Python Raspberry Pi GPIO Klasse importieren
import RPi.GPIO as GPIO

GPIO.setwarnings(False)
# Festlegung der Nutzung der vorgegebenen Nummerierung der GPIOs
GPIO.setmode(GPIO.BCM)

# Namen von True und False zum besseren Verstaendnis festlegen (Klarnamen)
HIGH = True # 3,3V Pegel (high)
LOW = False # 0V Pegel (low)

# SCI Funktion
def getAnalogData(adCh, CLKPin, DINPin, DOUTPin, CSPin):
# Pegel definieren
GPIO.output(CSPin, HIGH)
GPIO.output(CSPin, LOW)
GPIO.output(CLKPin, LOW)

cmd = adCh
cmd |= 0b00011000 # Kommando zum Abruf der Analogwerte des Datenkanals adCh

# Bitfolge senden
for i in range(5):
if (cmd & 0x10): # 4. Bit pruefen und mit 0 anfangen
GPIO.output(DINPin, HIGH)
else:
GPIO.output(DINPin, LOW)
# Clocksignal negative Flanke erzeugen
GPIO.output(CLKPin, HIGH)
GPIO.output(CLKPin, LOW)
cmd <<= 1 # Bitfolge eine Position nach links verschieben

# Datenabruf
adchvalue = 0 # Wert auf 0 zuruecksetzen
for i in range(11):
GPIO.output(CLKPin, HIGH)
GPIO.output(CLKPin, LOW)
adchvalue <<= 1 # 1 Postition nach links schieben
if(GPIO.input(DOUTPin)):
adchvalue |= 0x01
time.sleep(0.5)
return adchvalue

# Konfiguration Eingangskanal und GPIOs
CH = 0 # Analog/Digital-Channel
CLK = 11 # Clock
DIN = 10 # Digital in
DOUT = 9 # Digital out
CS = 8 # Chip-Select

# Pin-Programmierung
GPIO.setup(CLK, GPIO.OUT)
GPIO.setup(DIN, GPIO.OUT)
GPIO.setup(DOUT, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
value=getAnalogData(chan, CLK, DIN, DOUT, CS)
if int(value) < int(crit):
sys.stdout.write("CRIT")
status=2
elif value < warn:
sys.stdout.write("WARN")
status=1
else:
sys.stdout.write("OK")
status=0
sys.stdout.write(' - Channel' + str(chan) + ' = ' + str(value))
sys.stdout.write('|ch' + str(chan) + '=' + str(value) + ';' + str(warn) + ';' + str(crit) + ';0;1023')
print
sys.exit(status)