Code:
#include "asuro.h"
#define TRIGGERLEVEL 640
#define HYSTERESIS 5
#define LOW 0
#define HIGH 1
#define DURCHLAUF 200
void linien_verfolgen ( int *wert3,int z);
int main(void)
{
unsigned int data[2];
signed int status[2]={0,0};
signed char difference=0;
unsigned int data2[2];
int hell;
unsigned char wert1[5];
unsigned char wert[200];
unsigned char d,e,f,g,i,t,h;
unsigned char a=0;
int b=1;
unsigned char resultat=0;
int count1=0;
unsigned char count2=0;
char zeichen1[16]={'H','V','F','Ü','L','Ä','P','J','B','X','C','Y','Z','Q','Ö','\0'};
char zeichen2[9]={'S','U','R','W','D','K','G','O','\0'};
char zeichen3[6]={'I','A','N','M','\0'};
char zeichen4[4]={'T','E','\0'};
char w;
int wert2[10];
unsigned char count3=0;
unsigned char eingabe[] = "0123";
Init();
MotorDir(FWD, FWD);
while(PollSwitch()==0) //start helligkeitswert einstellung
{
}
SerWrite ((unsigned char*)" hellgkeitswert speichern ",26); //speichert den Wert für weisse Fläche
FrontLED(ON); //schaltet das Licht für Lichtsensoren ein
LineData(data2); //Ausführ befehl für einlesen von Lichtsensoren
SerWrite ((unsigned char*)"\n",2);
hell = data2[0]-14; //stellt tolleranz für den weiss abgleich her
PrintInt(hell);
for (i = 0; i < 100; i++) //Pause
Sleep (255);
FrontLED(OFF); //schaltet das Licht für Lichtsensoren aus
SerWrite ((unsigned char*)" hellgkeitswert gespeichern ",28);
for (i = 0; i < 100; i++)
Sleep (72);
SerRead (eingabe, 3, 0);
for (i = 0; i < 100; i++)
Sleep (72);
SerWrite ((unsigned char*)" Los gehts! ",12);
FrontLED(ON); //schaltet das Licht für Lichtsensoren ein
for (i = 1; i < DURCHLAUF; i++)
{
OdometrieData(data); // Helligkeitswerte der Lichtschranken auslesen
if ((status[0]==0) && (data[0]>TRIGGERLEVEL+HYSTERESIS))
{ // Wechsel linker Sensor von niedrig auf hoch?
status[0]=1;
difference++;
}
if ((status[0]==1) && (data[0]<TRIGGERLEVEL-HYSTERESIS))
{ // Wechsel linker Sensor von hoch auf niedrig?
status[0]=0;
difference++;
}
if ((status[1]==0) && (data[1]>TRIGGERLEVEL+HYSTERESIS))
{ // Wechsel rechter Sensor von niedrig auf hoch?
status[1]=1;
difference--;
}
if ((status[1]==1) && (data[1]<TRIGGERLEVEL-HYSTERESIS))
{ // Wechsel rechter Sensor von hoch auf niedrig?
status[1]=0;
difference--;
}
if (difference>0) MotorSpeed(155-difference,155); // Zähldifferenz passend auf die Motoren verteilen
else MotorSpeed(155,155+difference);
LineData(data2); //Ausführ befehl für einlesen von Lichtsensoren
wert[i] = data2[0]; // Helligkeitswerte der Lichtschranken in ein array speichern
PrintInt(data2[0]);
}
MotorDir(BREAK,BREAK); //Haalt!
FrontLED(OFF); //schaltet das Licht für Lichtsensoren aus
BackLED(ON,ON);
while(PollSwitch()==0) //start auswertung
{
}
SerWrite((unsigned char*)" Auswerten ",11);
for (i=1;i<DURCHLAUF;i++) //schleife für das auswerten der hell dunkel unterschiede
{
if (wert[i]<hell) //wenn wert im Arry kleiner als der Hell Wert array neu mit 1 belegen
{
wert[i]=1;
PrintInt(wert[i]);
SerWrite((unsigned char*)"\n",2);
}
else if(wert[i]>=hell)
{
wert[i]=0; //wenn wert im Arry grösser als der Hell Wert array neu mit 0 belegen
PrintInt(wert[i]);
SerWrite((unsigned char*)"\n",2);
}
}
SerWrite((unsigned char*)" Auswertung:\n ",15);
for(h=0,e=0;e<12;e++,h++)
{
for (;b<DURCHLAUF;b++,h++) //schleife für vereinfachung der Lichtsensor daten in eins und null
{
if ( wert[a] == 0 )
{
for ( ; a<DURCHLAUF;a++) //0 auswertung
{
if (wert[a]==0) //die nullen in Alphabet Array speichern
count1++;
else if (count1>9&&b>1) //wert für buchstaben wechsel
{
b=DURCHLAUF;
count1=0;
wert2[h]=2;
count3++;
break;
}
else if (count1>9 && b==1) //wert für anfangs toleranz
{
b--;
count1=0;
break;
}
else if (count1<=7 && count1>2) //wert für zeichen wechsel
{
b--;
count1=0;
break;
}
}
}
else
{
for ( ;a<DURCHLAUF;a++) // 1 auswertung
{
if (wert[a] == 1)
count1++;
else if (count1>=5) //wert für strich
{
wert1[b]=1;
count2++;
count1=0;
wert2[h]=1;
count3++;
break;
}
else if (count1<5 && count1>=1) //wert für punkt
{
wert1[b]=0;
count2++;
count1=0;
wert2[h]=0;
count3++;
break;
}
}
}
}
t=count2; //count für anzahl punkt und strich
t--; //für auswertung wichtig count zahl minus eins
for (d=t,g=2;d>0;d--,g*=g) //schleife für die beschränkung der anzahl von zeichen in einem buchstaben
{
f=d+1; //wird der wert des letzten zeichens ermittelt von letzter stelle des arrays gerechnet wird
wert1[d]*=g; //array wird bei drei zeichen von rechts nach links gerechnet mal 1 mal 2 mal 4 mal 8
wert1[d]+=wert1[f]; //zusammen ergibt sich für die zeichen einen wert den man dan bei buchstaben array abfragen kann
resultat=wert1[d]; //speichern des arry wertes in eine variabel
}
if ( count2==4){ //den buchstaben für das zeichen die vierten array reihe ausgeben
w=zeichen1[resultat];
SerWrite ((unsigned char*)" ",1);
SerWrite ((unsigned char*)&w,1);
count2=0;
b=1;
}
else if ( count2==3){ //den buchstaben für das zeichen die dritte array reihe ausgeben
w=zeichen2[resultat];
SerWrite ((unsigned char*)" ",1);
SerWrite ((unsigned char*)&w,1);
count2=0;
b=1;
}
else if ( count2==2){ //den buchstaben für das zeichen die zweite array reihe ausgeben
w=zeichen3[resultat];
SerWrite ((unsigned char*)" ",1);
SerWrite ((unsigned char*)&w,1);
count2=0;
b=1;
}
else if( count2==1){ //den buchstaben für das zeichen die erste array reihe ausgeben
w=zeichen4[resultat];
SerWrite ((unsigned char*)" ",1);
SerWrite ((unsigned char*)&w,1);
count2=0; //um für das nächste zeichen weiter zu rechnen müssen diese variablen zurückgestellt werden
b=1;
}
else
b=1;
}
linien_verfolgen(wert2,count3);
while(1);
return 0;
}
void linien_verfolgen ( int *wert3,int z)
{
unsigned int data4[2];
unsigned int i;
Init();
SerWrite ((unsigned char*)" Ready? ",8);
while(PollSwitch()==0)
{
}
SerWrite ((unsigned char*)" Los gehts! ",12);
FrontLED(ON);
MotorDir(FWD,FWD);
while(1)
{
LineData(data4);
for (i=0;i<z;i++)
{
if (wert3[i] == 2)
{
StatusLED(OFF);
for (i = 0; i < 100; i++)
Sleep (200);
}
if (wert3[i] == 0);
{
StatusLED(RED);
for (i = 0; i < 100; i++)
Sleep (75);
StatusLED(OFF);
}
if (wert3[i] == 1);
{
StatusLED(RED);
for (i = 0; i < 100; i++)
Sleep (200);
StatusLED(OFF);
}
}
if(data4[0]>data4[1])
{
MotorSpeed(160,0);
BackLED(ON,OFF);
}
else if (data4 [0] < data4 [1] )
{
MotorSpeed(0,160);
BackLED(OFF,ON);
}
else
{
MotorSpeed(160,160);
BackLED(ON,ON);
}
}
}
Lesezeichen