Figaro

Aus PILARKTO.ORG Open Laboratory e.V.
Wechseln zu: Navigation, Suche
Bild des LPT Boards
Projektstart 2010/08/04
Projektleiter Benedikt.schumm
Betreuer Philippe.Käufer
Status obsolete
Projektname Figaro
Bildbeschribung Bild des LPT Boards

Inhaltsverzeichnis

Figaro V1

Figaro wird in der Version 1 nicht weiterentwickelt, siehe Figarov2

Projektbeschreibung

Figaro ist ein Projekt, das es uns ermöglicht den Status des Bunkers abzubilden. In der Aktuellen version lässt sich über einen Magnetschalter an der Türe auslesen ob die Türe geöffnet oder geschlossen ist.

Für spätere Versionen ist angedacht zusätzlich:

 * Die Temperatur
 * Lautstärke
 * Luftfeuchtigkeit
 * Helligkeit

auszulesen.


Materialien

Folgende Materialien haben wir verwendet.

 * Rechner mit Parallelport
 * Parallelkabel
 * Widerstände 10kO
 * Sensor ( in unserem Fall ein Magnetsensor )
 * Kabel
 * Lötkolben
 * Schrumpfschlauch

Meilensteine

 * Brainstorming
 * Entwurf des Schaltplans
 * Programmierung
 * Inbetriebnahme



Brainstorming

Zuerst haben wir uns einige Gedanken zum generellen Ablauf gemacht. Dabei haben wir uns dazu entschlossen über einen Port am Cumputer möglichst einfach den Status der Türe herauszufinden.

phylogenetic tree

Nach einiger Recherche haben wir uns für den Parallelport entschieden.


Schaltplan

Der Schaltplan wurde mit Hilfe von xyz erstellt.

Zum verständniss möchte ich kurz die Belegung der Pins am Parallelport erklären.

Parallelport

Der Paralellport besteht aus 25 Pins. Diese Pins sind in 4 Gruppen unterteilt.

 * Input Pins ( Können nur lesen )
 * Output Pins ( können nur schreiben )
 * Controll Pins ( Können Lesen und Schreiben )
 * Erdung ( Dienen zur vervollständigung des Schaltplans )


Die Belegund sieht daher wie folgt aus:

2-9 Output Pins

10-13,15 Input Pins

14,16,17 Controll Pins

18-25 Erdung

Ein Outputpin kann 1 (5V) und 0 (0V) als Status annehmen.

Schaltplan

phylogenetic tree




Programmierung

Bei der Programmierung habe wir auf das Framwork Parapin gesetzt. Damit konnten wir einfach den Status der Pins setzen bzw auslesen.

Parapin kommt bereits mit Beispielprogrammen. Mit diesen Beispielprogrammen haben wir zuerst etwas experimentiert.

Ein kurzer ausschweif in Parapin:

pin_init_user(LPT1) // Inizialisiert den Parallelport set_pin(LP_PIN[2]) // Setzt Pin 10 high / 1 ( 5V ) pin_is_set(LP_PIN[10]) // Frägt den Status des Ports 10 ab

Inbetriebnahme

Bilder folgen... Der Status kann über die Homepage www.pilarkto.org abgerufen werden. Dazu haben wir den Aktuellen Status in eine MySQL Datenbank schreiben lassen. Diese kann dan bequem über PHP auf der Homepage ausgelesen werden.

phylogenetic tree


Sourcecode

Der Aktuelle Sourcecode: ( Noch verbesserungsbedürftig )

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mysql/mysql.h>
#include <string.h>
 
#include "parapin.h"
 
void mysqlConnect(int status) ;
 
int main(int argc, char *argv[])
{
  int status = -1;
 
  if (pin_init_user(LPT1) < 0)
    exit(0);
 
  pin_input_mode(LP_DATA_PINS);
  pin_input_mode(LP_SWITCHABLE_PINS);
  pin_output_mode(LP_DATA_PINS | LP_SWITCHABLE_PINS);
  for (;;)
  {
    if(status != pin_is_set(LP_PIN[10]))
    {
        usleep(2000 * 1000);
        if(status != pin_is_set(LP_PIN[10]))
        {
                status = pin_is_set(LP_PIN[10]);
                time_t t;
                struct tm *ts;
 
                t = time(NULL);
                ts = localtime(&t);
                printf("%s um %s \n", status ? "Open" : "Close", asctime(ts));
                mysqlConnect(status ? 1 : 0);
                usleep(2000 * 1000);
        }
    }
  }
  printf("\n\n");
  return 0;
}
 
void mysqlConnect(int status)
{
   MYSQL *conn;
   MYSQL_RES *res;
 
   char *server = "HOST";
   char *user = "USER";
   char *password = "PASSWORT"; /* set me first */
   char *database = "DATENBANK";
 
   conn = mysql_init(NULL);
 
   /* Connect to database */
   if (!mysql_real_connect(conn, server,
         user, password, database, 0, NULL, 0))
   {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }
 
   /* send SQL query */
 
   char sqlquery[41];
   sprintf(sqlquery,"INSERT INTO doorlog(status) VALUES(%i)",status);
 
   if (mysql_query(conn, sqlquery))
   {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }
 
   res = mysql_use_result(conn);
 
   /* close connection */
   mysql_free_result(res);
   mysql_close(conn);
}