Guten Morgen Jungs,
sorry, dass ich euch zur Zeit etwas "nerve", aber ich denke, dafür gibt es ja dieses Forum, um Fragen zu stellen, die von Leuten beantwortet werden, die mehr Ahnung vom Thema haben
Nachdem das Auslesen der Schalter und das Ansteuern der LEDs sehr gut mit dem Raspberry klappt, möchte ich mich an die OneWire-Sensoren wagen.
Ich habe nun meine Schaltung umgebaut, sodass ich momentan 3 OneWire-Temperatursensoren und 1 OneWire-Hallsensor (für Drehzahlerfassung) betreibe.
Mit folgendem Befehl (laut Tutorial) möchte ich nun die Werte einlesen, was hoffentlich auch klappen wird (gerade keinen Raspberry zur Hand)..:
Zitat
cat /sys/bus/w1/devices/w1_bus_master1/28-000004118a7f/w1_slave
Dieser Befehl liefert mir dann die Temperatur des Sensors "28-000004118a7f".
Beim Hallsensor werde ich wohl genauso vorgehen, nur dass es dann eben keine Temperatur sein wird
Nun aber zur eigentlichen Frage.
Da das Ganze ein Projekt für meine Schule wird, möchte ich die 4 OneWire-Sensoren sowie die beiden Schalter (die an den GPIOs angeschlossen sind) zyklisch abfragen.
Da ich aus der Mikrocontrollerwelt schon etwas gelesen habe, wäre mein Verfahren "polling".
Darunter verstehe ich, dass man die Sensoren endlos (Schleife) abfragt. Da in Linux ja alles eine Datei ist, werden die letzten Daten quasi immer gepuffert, sodass man nicht zum Zeitpunkt des Eintritts eines Ereignisses reagieren muss, richtig? (Im Beispiel der OneWire: Temperaturen werden ja quasi in eine Datei geschrieben, die man danach einfach nur mit "cat" ausliest).
Allerdings habe ich Bedenken, dass es ziemlich rechenintensiv sein wird, wenn man ständig diese Schalter abfragt.
Ach übrigens: eine Abfragezeit von 1 Sek. der gesamten Sensoren/Schalter wäre völlig ausreichend.
Es soll außerdem überprüft werden, ob in einer Datenbank ein Bit ("flag") gesetzt wurde, damit eine LED eiongeschaltet werden soll.
Nebenbei (Interrupt?) soll dann auch noch die Motordrehzahl (über den Hallsensor) erfasst werden. Das habe ich unten mit der Interrupt-Routine gekennzeichnet. Allerdings weiß ich nciht wie ich das umsetzen kannn.
Gibt es da eine andere Möglichkeit? Ich weiß leider noch nicht wie sich das verhält, da ich es noch nicht testen konnte. Vielleicht aber ist auch die Sekunde nicht so rechenintensiv?
Das Ganze sollte übrigens am besten in Perl realisiert werden.
Hier mal mein Beispielcode, wie ich es machen würde:
ZitatAlles anzeigen#! /usr/bin/perl
while(1)
{
if( my_SQL_read_LED_flag() == 1) // wenn Flag gesetzt wird
{
LED_on();
}
else
{
LED_off();
write_in_mySQL( OneWire_1(), "temperature_1" );
write_in_mySQL( OneWire_2(), "temperature_2" );
write_in_mySQL( switch_1(), "engine_on" );
write_in_mySQL($drehzahl);
Drehzahl_wurde_gelesen();
}
usleep(1000);
}
#------------------------------------------------------------------
sub LED_on
{
system("gpio write 0 1");
}
sub LED_off
{
system("gpio write 0 0");
}
sub INTERRUPT_ROUTINE
{
$drehzahl++;
}sub Drehzahl_wurde_gelesen
{
$drehzahl = 0;
}
Vielen Dank und Gruß