Medibox

auf dem Bild fehlen die Anbauteile aus dem 3D-Drucker

Einführung:

In diesem Projekt soll die Möglichkeit geschaffen werden automatisiert Medikamente zu stellen. Diese sollen nicht mehr zeitaufwändig pro Tag in verschiedene Behälter gefüllt werden müssen sondern nur noch in die Fächer des Medikamentendosierer „Medibox“ gefüllt werden. Die Ausgabe erfolgt automatisiert und durch den vorher über die Webseite erstellten Einnahmeplan. In dem Webinterface werden der Medikamentenname, die Anzahl der Medikamente und die Einnahmezeitfenster eingegeben.

Im Rahmen des Projektes ist es möglich drei Medikamente in die Fächer der „Medibox“ zu hinterlegen. Eine Weboberfläche ermöglicht es die Anzahl sowie die Einnahmezeitfenster(Morgens,Mittags,Abends) zu hinterlegen. Die Fächer werden vor jedem Durchlauf geprüft, ob noch genügend Medikamente für die Ausgabe vorhanden sind. Falls ein Medikament nicht mehr ausreichend vorhanden ist wird die Ausgabe abgebrochen und der Nutzer via E-Mail informiert. Die Motoren werden dann in Ihre Ausgangsposition zurück.

Verwendete Komponenten:

  • Raspberry Pi 3 Model B
  • 3x Schrittmotor ULN2003 mit Driver Board 28BYJ-48
  • 5mm Kupplungen (Verbindung Schrittmotoren Anbauteile/Gewindestange)
  • 5mm Gewindestange
  • Anbauteile 3D-Drucker

Projektaufbau:


Konfiguration:

Im Projekt verwendete Pakete:

  • apache2
  • mysql
  • mysql.connector
  • php5
  • python
  • python3
  • time
  • schedule
  • sys
  • RPi.GPIO as GPIO
  • subprocess

Apache

Einrichtung des Webserver Apache:

Pakete auf neusten Standen bringen

Command: sudo apt-get update

Donwload und installation apache 2

Command: sudo apt-get install apache2

Ausführen:

PHP 7

Download und Installation

Command: apt-get install php7.0

Nach einem Neustart ist PHP 7 einsatzbereit

MySQL

MySQL Pakete mit allen Abhängigkeiten installieren

Command: sudo apt-get install mysql-server php5-mysql mysql-client

Im nächsten Schritt Passwort vergeben und Bestätigen und anschließend neustarten

Phpmyadmin

Der Webserver benötigt keine Verwaltung, aber zum Anzeigen und Testen der Datensätze ist Phpmyadmin sehr hilfreich.

Download und Installation der angegebenen Pakete

Command: sudo apt-get install php5-mysql libapache2-mod-auth-mysql phpmyadmin

Im weiteren Verlauf muss diese mehrfach bestätigt werden und ein Passwort gesetzt werden.

Anschließend muss Apache mit Phpmyadmin noch verknüpft werden: *Dazu muss die Datei (/etc/php5/apache2/php.ini*) bearbeitet werden

Command: sudo vi /etc/php5/apache2/php.ini

Am Ende der Datei wird folgenden eingefügt extension=mysql.so

Phpmyadmin ist nun unter: http://raspberrypi/phpmyadmin/ erreichbar

Nun können Dateien ins Verzeichnis /var/www hochgeladen werden und sind unter localhost/dateiname aus dem Netzwerk zu erreichen

LINK https://tutorials-raspberrypi.de/webserver-installation-apache2/

Weboberfläche /& html

Nach der o.g. Einrichtung des Webservers können html-Dateien unter dem Pfad: /var/www/html/ abgelegt werden.

Die Weboberfläche ist html basiert. Die durch den Nutzer eingegebenen Werte werden an ein PHP-Skript (POST) übergeben Benutzereingaben übergeben und ausgeführt.

Hier werden u.a. feste Werte vergeben, um „mid“ (MotorID) das Medikament an ein Fach/Motor zu binden und „medcount“ (Medikamentcount) um den Startwert für das Zählen der Medikamente auf 1 zu setzen. Außerdem eine Selectbox zur Auswahl der Medikamentenanzahl.

medi.html
<h3>1. Medikament eingeben</h3>
   <p>
     <input type="hidden" name="mid" value="1">
     <input type="hidden" name="medcount" value="1">
     <label for="name">Name: </label>
     <input name="name" id="name" type="text" size="35" maxlength="50" />
   </p>
   <p>
     <label for="anzahl">Anzahl: </label>
 <select name=anzahl id="anzahl" >
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
</select>

Python

Beispielcode: Prüfung, ob das Fach zum Medikament 1 leer ist, wenn Bedingung erfüllt ist werden die Funktionen ausgeführt u.a. E-Mail an Nutzer, Zurückstellen der Motoren ins Ausgangsposition und Abbruch des Skripts.

medibox.py
#pruefen ob das Medikament 1 voll ist
def fach1voll():
    cursor = connection.cursor()
    cursor.execute("SELECT anzahl,medcount from Medikament where mid=1")
    resultvoll = cursor.fetchall()
    cursor.close()
    for data in resultvoll:
	   if data[0]== 1 and data[1]>=12:
	       print("ERROR: Das Medikament 1 ist leer!!! ")
               zurueckstellen1()
               zurueckstellen2()
               zurueckstellen3()
               #updatemid()
               subprocess.call("./mail_1.sh", shell=True)
               GPIO.cleanup()
               sys.exit(0)
           elif data[0]== 2 and data[1]>=11:

Abfrage aus Datenbank, wie viele Medikamente ausgegeben wurden und entsprechend wird der Motor in die andere Richtung zurückgedreht

medibox.py
def zurueckstellen1():
    cursor = connection.cursor()
    cursor.execute("SELECT medcount,anzahl from Medikament where mid=1")
    result4 = cursor.fetchall()
    cursor.close()
    for data in result4:
        if data[0]==2:
            RIGHT_1(100)
        elif data[0]==3:
            RIGHT_1(200)
        [...]
        elif data[0]==10:
            RIGHT_1(900)
        elif data[0]==11:
            RIGHT_1(1000)
        elif data[0]==12:
            RIGHT_1(1100)

Das Module „Schedule“ ermöglicht die Zeitsteuerung. Für das Projekt wurde in der Testphase ein kürzeres Intervall verwendet. Unter Realbedingungen würde die Ausgabe Morgens(8 Uhr), Mittags (12 Uhr) und Abends um ( 18 Uhr ) erfolgen. „Schedule“ wird über eine while-Schleife ausgeführt, der Job(z.B. morgens3) wird jeweils an die Funktion gehangen.

medibox.py
#verwendete Zeitsteuerung
schedule.every(4).seconds.do(morgens3)	
#Zeitsteuerung unter Realbedingungen
schedule.every().day.at("08:00").do(morgens3)

Funktion um zu schauen, ob für das erste Medikament eine Ausgabe erfolgen muss, außerdem die Prüfung wie viel Stück ausgegeben werden müssen.

medibox.py
def morgens1():
    for data in result:
        if data[1]== 1 and data[2]== 1: 
               cursor = connection.cursor()
               cursor.execute("update Medikament set medcount=medcount+1 WHERE mid=1")
               connection.commit()
               cursor.close()
               LEFT_1(100)
               print ("Morgens: 1.Medikament:" + data[0] + "Ein Stueck") 
        elif data[1]== 2 and data[2]== 1:
               cursor = connection.cursor()
               cursor.execute("update Medikament set medcount=medcount+2 WHERE mid=1")
               connection.commit()
               cursor.close()
               LEFT_1(200)
               print ("Morgens: 1.Medikament:" + data[0] + "Zwei Stueck")
        elif data[1]== 3 and data[2]== 1:
               cursor = connection.cursor()
               cursor.execute("update Medikament set medcount=medcount+3 WHERE mid=1")
               connection.commit()
               cursor.close()
               LEFT_1(300)
               print ("Morgens: 1.Medikament:" + data[0] + "Drei Stueck")
        else:
               print ("1.Medikament" + data[0] + " Morgens keine Ausgabe")
schedule.every(4).seconds.do(morgens1)

Probleme

Das größte Problem war die Installation von dem Webserver Apache und der Integration von PHP. Trotz guter Anleitung hat dies viele Anläufe gebraucht um das System zu etablieren.

Nach erfolgreicher Integration gab es das Problem, dass das in der Installation vergebene Passwort für den MySql User nicht funktionierte. Nach langer Internetrecherche gab es einen Lösungsweg zum Zurücksetzen des Passworts:

www.sysadminslife.com/linux/mysql-user-passwort-aendern/