Code:
/*Messprogramm für NIBOBee (by Rabenauge)
Beim betätigen des linken Fühlers nach hinten werden die drei
Liniensensoren der Reihe nach mehrmals abgefragt und Durchschnittswerte ermittelt. Die An-
zahl der Messungen wird mit der Variable iv eingestellt. Während des Messvorganges blinken die
roten LED für jede Messung kurz auf, während der Zeit sollte der Roboter nicht bewegt werden.
Nach der Messung werden die Ergebnisse mittels den LED ausgegeben: jede LED steht für eine
Stelle, das heisst, links gelb blinkt die Tausender aus, links rot die Hunderter, rechts rot
die Zehner und rechts gelb die Einer.
Bevor die Ausgabe beginnt, leuchten kurz alle vier LED, um das Ende der Messung anzuzeigen.
Danach werden der Reihe nach alle drei Messwerte ausgegeben, vor der Ausgabe wird das je-
weils durch die roten LED (leuchten anderthalb Sekunden) visualisiert: leuchtet die Linke,
wird anschliessend der Wert des linken Sensors ausgegeben, leuchten beide, der Wert des mitt-
leren, leuchtet die rechte dann...
Indem man den linken Fühler nach vorne betätigt, kann das Messergebnis gelöscht werden, um eine
neue Messung vorzunehmen.
*/
#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/sens.h>
#include <nibobee/delay.h>
#include <nibobee/line.h>
int main()
{
enable_interrupts();
led_init();
sens_init();
line_init();
while (1==1)
{
int mode=0; //Modus, per Eingabe
int i=0; //Zählervariable
int iv=10; //Variable Messwiederholung,
//ändern für mehr/weniger Messungen
int l_line=0; //Rückgabe Messergebnis Linie_links
int r_line=0; //Rückgabe Messergebnis Linie_rechts
int c_line=0; //Rückgabe Messergebnis Linie_mitte
int status_L =sens_getLeft(); //linker TastSensor
switch (status_L)
{
case -1: mode=1; //nach hinten =Messung starten
led_set(LED_L_RD,0);
led_set(LED_L_YE,1); //Auswahl zeigen
delay(1500);
led_set(LED_L_YE,0);
delay(500);
break ;
case +1: mode=2; //nach vorne =Messung zurücksetzen
led_set(LED_L_YE,0);
led_set(LED_L_RD,1); //Auswahl zeigen
delay(1500);
led_set(LED_L_RD,0);
delay(500);
break ;
default :led_set(LED_L_RD,0); //links Mitte
led_set(LED_L_YE,0);
break ;
}
if(mode!=0) //was soll es werden?
{
switch (mode)
{
case 1:
for (i=0; i<iv; i++) //Messchleife
{
led_set(LED_L_RD,1);
led_set(LED_R_RD,1);
delay(5);
l_line=(l_line + line_get(LINE_L)); //messen und addieren
r_line=(r_line + line_get(LINE_R));
c_line=(c_line + line_get(LINE_C));
led_set(LED_L_RD,0);
led_set(LED_R_RD,0);
delay(500);
}
l_line= (l_line/iv); //Ergebnis durch Anzahl Messungen
r_line= (r_line/iv);
c_line= (c_line/iv);
delay(500);
break;
case 2:
led_set(LED_L_RD,1); //Messergebnisse zurücksetzen
led_set(LED_R_RD,1);
delay(500);
led_set(LED_L_YE,1);
led_set(LED_R_YE,1);
delay(20);
l_line=0;
r_line=0;
c_line=0;
led_set(LED_L_RD,0);
led_set(LED_R_RD,0);
led_set(LED_L_YE,0);
led_set(LED_R_YE,0);
break;
default:
{line_get(0);
break;
}
}
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_L_RD,1); //zuerst den linken Liniensensor
delay(1000);
led_set(LED_L_RD,0);
delay(1500);
if (l_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
l_line=(l_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (l_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
l_line=(l_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (l_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
l_line=(l_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (l_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
l_line=(l_line-1);
}
} //linker Sensor fertig
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_R_RD,1); //mittlerer Liniensensor
led_set(LED_L_RD,1);
delay(1000);
led_set(LED_R_RD,0);
led_set(LED_L_RD,0);
delay(1500);
if (c_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
c_line=(c_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (c_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
c_line=(c_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (c_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
c_line=(c_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (c_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
c_line=(c_line-1);
}
} //mittlerer Sensor fertig
delay(1000); //Anzeige der gemessenen Werte
led_set(LED_R_RD,1); //rechter Liniensensor
delay(1000);
led_set(LED_R_RD,0);
delay(1500);
if (r_line>1000) //Tausender?
{
led_set(LED_L_YE,1);
delay(300);
led_set(LED_L_YE,0);
delay(300);
r_line=(r_line-1000);
}
for(i=0; i<10; i++) //Hunderter?
{
if (r_line>100)
{
led_set(LED_L_RD,1);
delay(300);
led_set(LED_L_RD,0);
delay(300);
r_line=(r_line-100);
}
}
for(i=0; i<10; i++) //Zehner?
{
if (r_line>10)
{
led_set(LED_R_RD,1);
delay(300);
led_set(LED_R_RD,0);
delay(300);
r_line=(r_line-10);
}
}
for(i=0; i<10; i++) //Einer?
{
if (r_line>1)
{
led_set(LED_R_YE,1);
delay(300);
led_set(LED_R_YE,0);
delay(300);
r_line=(r_line-1);
}
} //Ende Ausgabe
}
}
}
Übrigens: ich _denke_ dass die Ausgaben stimmen, aber ich garantiere es natürlich nicht, schaut bitte mal über den Code, ob sich bei der Auflösung der Werte kein Fehler eingeschlichen hat!
Lesezeichen