Hallo zusammen.
Ich gehöre zu den blutigen einsteigern und versuche mir mit kleinen Projekten diese Wissenschaft anzueignen.
Ich versuche gerade mit einem Ultraschallsensor HC-SR04 einen Abstand zu messen, und je nach Entfernung auf einer 8x8 LED-Matrix MAX7219 verschiedene Sachen anzeigen zu lassen.
Nun habe ich aber gemerkt das irgendetwas das ganze System ins stocken bringt. Sprich die Anzahl der Abstandsmessungen geht zum Teil sehr in die Knie und ich weiß leider nicht woran das liegt.
Ich habe mir schon extra den Umgang mit den Millis angeeignet damit das ganze System keine Pause macht. Abgesehen von zwei delay-Zeiten beim ein uns ausschalten des Sensors, 5 und 10 Millisekunden, habe ich überall nur die millis benutzt.
Ich hoffe einer von euch findet die Zeit und kann mir sagen woran das evtl liegt, oder was man besser machen könnte.
Ich gehe davon aus dass wenn ich den Sensor mit einem eigennen Arduino-Nano betreiben würde und die Werte an den Uno übetragem, dass dann das Problem gelöst ist da der Sensor dann nicht von anderen Aufgaben unterbrochen wird.
Aber vielleicht liegts ja auch nur am Code.
Vielen Dank für eure Aufmerksamkeit.
LG
Basti
#include "LedControl.h"
LedControl lc=LedControl(12,10,11,1); // Pins: DIN,CLK,CS, # Anzahl der Bildschirme
unsigned long startzeit; //Variable Startpunkt der Millis
unsigned long vergangene_zeit; // Variable um die vergangene Zeit zu speichern
int delay_zeit_1 = 100; // Variable der Zeit die zwischen den einzelnen LED Bildern vergehen soll um kleine Animationen zu machen
int delay_zeit_2 = 200; // Variable der Zeit die zwischen den einzelnen LED Bildern vergehen soll um kleine Animationen zu machen
int delay_zeit_3 = 300; // Variable der Zeit die zwischen den einzelnen LED Bildern vergehen soll um kleine Animationen zu machen
int delayTimeMessung = 100; // ALTE Variable der Zeit die zwischen den einzelnen LED Bildern vergehen soll um kleine Animationen zu machen
// AB HIER KOMMEN DIE BILDER DIE IN DER LED MATRIX ANGEZEIGT WERDEN SOLL
byte smiley1[] = {B00111100,B01000010,B10001001,B10110101,B10000101,B10110101,B01000010,B00111100};
byte smiley2[] = {B00111100,B01000010,B10110101,B10000101,B10110101,B10001001,B01000010,B00111100};
byte richtung1[] = {B11000000,B01100000,B01100000,B00110000,B00110000,B01100000,B01100000,B11000000};
byte richtung2[] = {B00110000,B00011000,B00011000,B00001100,B00001100,B00011000,B00011000,B00110000};
byte richtung3[] = {B00001100,B00000110,B00000110,B00000011,B00000011,B00000110,B00000110,B00001100};
byte test[] =
{
B10000111,
B10111011,
B10111011,
B10000111,
B10111111,
B10111111,
B10111111,
B11111111
};
byte testt[] =
{
B11000011,
B11011101,
B11011101,
B11000011,
B11011111,
B11011111,
B11011111,
B11111111
};
int trigger=7; // Trigger-Pin des Ultraschallsensors an Pin7
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6
long dauer=0; // Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung=0; // Variable in der die berechnete Entfernung gespeichert wird
int Pieps=5; // Pieps-Modul an Pin5
void setup()
{
Serial.begin (9600);
lc.shutdown(0,false); // Wake up displays LED Matrix
lc.setIntensity(0,10); // Set intensity levels LED Matrix
lc.clearDisplay(0); // Clear Displays LED Matrix
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(Pieps, OUTPUT);
}
void bildzeit1() // Delay-Ersatz um zwischen den einzelnen LED-Bildern eine Pause zu haben
{
startzeit = millis();
vergangene_zeit = millis() - startzeit;
while (vergangene_zeit < delay_zeit_1)
{
vergangene_zeit = millis() - startzeit;
}
}
void bildzeit2() // Delay-Ersatz um zwischen den einzelnen LED-Bildern eine Pause zu haben
{
startzeit = millis();
vergangene_zeit = millis() - startzeit;
while (vergangene_zeit < delay_zeit_2)
{
vergangene_zeit = millis() - startzeit;
}
}
void bildzeit3() // Delay-Ersatz um zwischen den einzelnen LED-Bildern eine Pause zu haben
{
startzeit = millis();
vergangene_zeit = millis() - startzeit;
while (vergangene_zeit < delay_zeit_3)
{
vergangene_zeit = millis() - startzeit;
}
}
void messung() // ALTER Delay-Ersatz um zwischen den einzelnen LED-Bildern eine Pause zu haben
{
startzeit = millis();
vergangene_zeit = millis() - startzeit;
while (vergangene_zeit < delayTimeMessung)
{
vergangene_zeit = millis() - startzeit;
}
}
void ssmiley1() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,smiley1[i]);
}
}
void ssmiley2() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,smiley2[i]);
}
}
void srichtung1() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,richtung1[i]);
}
}
void srichtung2() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,richtung2[i]);
}
}
void srichtung3() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,richtung3[i]);
}
}
void stest() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,test[i]);
}
}
void stestt() // Code um ein Bild auf der LED Matrix anzuzeigen
{
for (int i = 0; i < 8; i++)
{
lc.setRow(0,i,testt[i]);
}
}
void loop()
{
digitalWrite(trigger, LOW); // Spannung für kurze Zeit vom Trigger-Pin nehmen, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5);
digitalWrite(trigger, HIGH); // Sendet Ultraschallwelle
delay(10);
digitalWrite(trigger, LOW); // Senden unterbrechen
dauer = pulseIn(echo, HIGH); // Zeit die der Schall gebraucht hat in Variable speichern
entfernung = (dauer/2) * 0.03432; // Berechnung der Entfernung in cm
Serial.println(entfernung);
if (entfernung > 51) // Schleife die eine Bildabfolge auf die LED-MAtrix übertragen soll je nach Entfernung
{
srichtung1();
bildzeit2();
srichtung2();
bildzeit2();
srichtung3();
bildzeit2();
}
if (entfernung < 50 && entfernung > 21) // Schleife die eine Bildabfolge auf die LED-MAtrix übertragen soll je nach Entfernung
{
ssmiley1();
bildzeit3();
ssmiley2();
bildzeit3();
}
if ( entfernung < 20) // Schleife die eine Bildabfolge auf die LED-MAtrix übertragen soll je nach Entfernung
{
stest();
digitalWrite(Pieps,HIGH);
messung();
stestt();
digitalWrite(Pieps,LOW);
messung();
}
}