Ich habe ein Programm geschrieben für zwei Abstandssensoren.
Es wird aber immer nur der Erste ausgelesen.
Die Abstandssensoren sind in Ordnung, weil ich sie schon ausgetauscht habe.
Warum wird der Erste erkannt und der Zweite nicht?
Im Anhang habe ich das Programm beigefügt.
Hardware:
Arduino-Mega mit TFT Display und zwei LCD Anzeigen.
Das funktioniert auch bis auf den zweiten Abstandssensor.
Ist da noch ein Bug im Programm?
// IMPORTANT: ELEGOO_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Elegoo_TFTLCD.h FOR SETUP.
//Technical support:goodtft@163.com
#include <LiquidCrystal_I2C.h>
#include <Elegoo_GFX.h> // Core graphics library
#include <Elegoo_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>
#define USE_Elegoo_SHIELD_PINOUT
#define MINPRESSURE 200
#define MAXPRESSURE 1000
#define PBOn 31
#define TCAADDR 0x70
void TCA9548A(uint8_t bus){
Wire.beginTransmission(0x70); // TCA9548A address is 0x70
Wire.write(1 << bus); // send byte to select bus
Wire.endTransmission();
Serial.print(bus);
}
const int XP=8,XM=A0,YP=A1,YM=9; //240x320 ID=0x9341
const int TS_LEFT=137,TS_RT=894,TS_TOP=93,TS_BOT=893;
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
LiquidCrystal_I2C lcd(0x3f, 40, 4); // bei 40x4
LiquidCrystal_I2C lcd1(0x27, 40, 4); // bei 40x4
TouchScreen ts = TouchScreen(XP, YP, XM,YM, 300);
Elegoo_GFX_Button on_btn, off_btn, stop_btn;
define SENDEN_vor 22
define ECHO_vor 23
define SENDEN_rueck 24
define ECHO_rueck 25
define LED_Rot_vor 26
define LED_Gelb_vor 28
define LED_Gruen_vor 30
define LED_Rot_rueck 27
define LED_Gelb_rueck 29
define LED_Gruen_rueck 31
define Stop_vor 32
define Stop_rueck 34
define LED_vor 33
define LED_rueck 35
// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
// D0 connects to digital pin 8 (Notice these are
// D1 connects to digital pin 9 NOT in order!)
// D2 connects to digital pin 2
// D3 connects to digital pin 3
// D4 connects to digital pin 4
// D5 connects to digital pin 5
// D6 connects to digital pin 6
// D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Elegoo_TFTLCD tft;
int pixel_x, pixel_y; //Touch_getXY() updates global vars
/*
//bool Touch_getXY(void)
{
TSPoint p = ts.getPoint();
pinMode(YP, OUTPUT); //restore shared pins
pinMode(XM, OUTPUT);
digitalWrite(YP, HIGH); //because TFT control pins
digitalWrite(XM, HIGH);
/* bool pressed = (p.z > MINPRESSURE && p.z < MAXPRESSURE);
if (pressed) {
pixel_x = map(p.x, TS_LEFT, TS_RT, 0, tft.width()); //.kbv makes sense to me
pixel_y = map(p.y, TS_TOP, TS_BOT, 0, tft.height());
}
return pressed;
}
*/
// Motor
int GSM1 = 36;
int MVor = 38;
int MRueck = 40;
// interne Variable
int buttonState1 = 0;
int buttonState2 = 0;
bool ButtonStatevor = 0;
bool ButtonStaterueck = 1;
String Direction;
long dauer=0;
long Zeit_vor;
long Zeit_rueck;
long Entfernung_vor=0;
long Entfernung_rueck=0;
int Geschwindigkeit_vor;
int Geschwindigkeit_rueck;
void setup(void)
{
Serial.begin(9600);
Serial.println(F("TFT LCD test"));
uint16_t ID = tft.readID();
#ifdef USE_Elegoo_SHIELD_PINOUT
Serial.println(F("Using Elegoo 2.4" TFT Arduino Shield Pinout"));
#else
Serial.println(F("Using Elegoo 2.4" TFT Breakout Board Pinout"));
#endif
Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());
tft.reset();
uint16_t identifier = tft.readID();
if(identifier == 0x9325) {
Serial.println(F("Found ILI9325 LCD driver"));
} else if(identifier == 0x9328) {
Serial.println(F("Found ILI9328 LCD driver"));
} else if(identifier == 0x4535) {
Serial.println(F("Found LGDP4535 LCD driver"));
}else if(identifier == 0x7575) {
Serial.println(F("Found HX8347G LCD driver"));
} else if(identifier == 0x9341) {
Serial.println(F("Found ILI9341 LCD driver"));
} else if(identifier == 0x8357) {
Serial.println(F("Found HX8357D LCD driver"));
} else if(identifier==0x0101)
{
identifier=0x9341;
Serial.println(F("Found 0x9341 LCD driver"));
}
else if(identifier==0x1111)
{
identifier=0x9341;
Serial.println(F("Found 0x9341 LCD driver"));
}
else {
Serial.print(F("Unknown LCD driver chip: "));
Serial.println(identifier, HEX);
Serial.println(F("If using the Elegoo 2.8" TFT Arduino shield, the line:"));
Serial.println(F(" #define USE_Elegoo_SHIELD_PINOUT"));
Serial.println(F("should appear in the library header (Elegoo_TFT.h)."));
Serial.println(F("If using the breakout board, it should NOT be #defined!"));
Serial.println(F("Also if using the breakout, double-check that all wiring"));
Serial.println(F("matches the tutorial."));
identifier=0x9341;
}
tft.begin(identifier);
tft.fillScreen(GREEN);
// tft.setRotation(3);
on_btn.initButton(&tft, 40, 290, 60, 30, WHITE, CYAN, GREEN, "Vor", 2);
stop_btn.initButton(&tft, 120, 290, 60, 30, WHITE, CYAN, GREEN, "Stop", 2);
off_btn.initButton(&tft, 200, 290, 60, 30, WHITE, CYAN, GREEN, "Ruck", 2);
on_btn.drawButton(false);
stop_btn.drawButton(false);
off_btn.drawButton(false);
pinMode (GSM1, OUTPUT);
pinMode (MVor, OUTPUT);
pinMode(MRueck, OUTPUT);
pinMode(SENDEN_vor, OUTPUT);
pinMode(SENDEN_rueck, OUTPUT);
pinMode(ECHO_vor, INPUT);
pinMode(ECHO_rueck, INPUT);
pinMode(LED_Rot_vor, OUTPUT);
pinMode(LED_Gelb_vor, OUTPUT);
pinMode(LED_Gruen_vor, OUTPUT);
pinMode(LED_Rot_rueck, OUTPUT);
pinMode(LED_Gelb_rueck, OUTPUT);
pinMode(LED_Gruen_rueck, OUTPUT);
pinMode(Stop_vor, INPUT);
pinMode(Stop_rueck, INPUT);
pinMode(LED_vor, OUTPUT);
pinMode(LED_rueck, OUTPUT);
// LCD starten
lcd.init();
lcd.backlight();
lcd1.init();
lcd1.backlight();
digitalWrite(LED_vor, LOW);
digitalWrite(LED_rueck, LOW);
//tcaselect(1);
}
void loop(void)
{
//unsigned long start = micros();
/*
{
bool down = Touch_getXY();
// on_btn.press
(
down && on_btn.contains(pixel_x, pixel_y)
);
off_btn.press
(
down && off_btn.contains(pixel_x, pixel_y)
);
if (
on_btn.justReleased()
)
on_btn.drawButton();
if (
off_btn.justReleased()
)
off_btn.drawButton();
if (
on_btn.justPressed()
)
{
on_btn.drawButton(true);
digitalWrite(PBOn, HIGH);
}
if (
off_btn.justPressed()
)
{
off_btn.drawButton(true);
digitalWrite(PBOn, LOW);
}
}
*/
buttonState1 =digitalRead(Stop_vor);
buttonState2 =digitalRead(Stop_rueck);
if (buttonState1 == HIGH)
{
ButtonStatevor = HIGH;
ButtonStaterueck = LOW;
}
if (buttonState2 == HIGH)
{
ButtonStatevor = LOW;
ButtonStaterueck = HIGH;
}
if (ButtonStatevor == HIGH)
{
(Direction = "rueck");
delay(100);
digitalWrite(LED_rueck, HIGH);
digitalWrite(LED_vor, LOW);
digitalWrite(MRueck, HIGH); // Motor beginnt zurück
digitalWrite(MVor, LOW); // Motor vor stopp
analogWrite(GSM1, Geschwindigkeit_rueck); // Motor soll mit der Geschwindigkeit "200" (max. 255) rotieren
}
if (ButtonStaterueck == HIGH)
{
(Direction = "vor");
digitalWrite(LED_vor, HIGH);
digitalWrite(LED_rueck, LOW);
analogWrite(GSM1, Geschwindigkeit_vor); // Motor soll mit der Geschwindigkeit "200" (max. 255) rotieren
}
// Signal für 5 Mikrosekunden low Vorwärts
digitalWrite(SENDEN_vor, LOW);
delayMicroseconds(5);
// Sender ausschalten
digitalWrite(SENDEN_vor, HIGH);
delay(10);
digitalWrite(SENDEN_vor, LOW);
// pulseIn → Zeit messen, bis das Signal zurückkommt
Zeit_vor = pulseIn(ECHO_vor, HIGH);
if (Entfernung_vor >= 500 || Entfernung_vor <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert");
}
/*
Entfernung in cm berechnen
Zeit/2 → nur eine Strecke soll berechnet werden
Umrechnung in cm
*/
Entfernung_vor = (Zeit_vor / 2) * 0.03432;
Serial.println("Dist-V:");
Serial.println(Entfernung_vor);
// 400 cm ist die maximal messbare Entfernung
// if (Entfernung_vor < 400)
// delay(100);
// Entfernung_rueck = (Zeit / 2) * 0.03432;
// 400 cm ist die maximal messbare Entfernung
// if (Entfernung_rueck < 400)
// delay(100);
// Berechnung der Geschwindigkeit in Abhängigkeit von Entfernung
if (Entfernung_vor < 20)
Geschwindigkeit_vor = 70;
if (Entfernung_vor > 20)
Geschwindigkeit_vor = 150;
if (Entfernung_vor > 60)
Geschwindigkeit_vor=200;
if (Entfernung_vor > 100)
Geschwindigkeit_vor=255;
// Signal für 5 Millisekunden ausschalten
digitalWrite(SENDEN_rueck, LOW);
delay(5);
// Sender einschalten
digitalWrite(SENDEN_rueck, HIGH);
delay(10);
digitalWrite(SENDEN_rueck, LOW);
// pulseIn → Zeit messen, bis das Signal zurückkommt
Zeit_rueck = pulseIn(ECHO_rueck, HIGH);
if (Entfernung_rueck >= 500 || Entfernung_rueck <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert");
}
/*
Entfernung in cm berechnen
Zeit/2 → nur eine Strecke soll berechnet werden
Umrechnung in cm
*/
Entfernung_rueck = (Zeit_rueck / 2) * 0.03432;
Serial.println("Dist-R:");
Serial.println(Entfernung_rueck);
// 400 cm ist die maximal messbare Entfernung
if (Entfernung_rueck < 400)
delay(100);
// Berechnung der Geschwindigkeit in Abhängigkeit von Entfernung
if (Entfernung_rueck < 20)
Geschwindigkeit_rueck = 70;
if (Entfernung_rueck > 20)
Geschwindigkeit_rueck = 150;
if (Entfernung_rueck > 60)
Geschwindigkeit_rueck=200;
if (Entfernung_rueck > 100)
Geschwindigkeit_rueck=255;
// Motor starten
if (ButtonStatevor == HIGH)
{
(Direction = "rueck");
delay(2000);
digitalWrite(LED_rueck, HIGH);
digitalWrite(LED_vor, LOW);
digitalWrite(MRueck, HIGH); // Motor beginnt zurück
digitalWrite(MVor, LOW); // Motor vor stopp
analogWrite(GSM1, Geschwindigkeit_rueck); // Motor zurueck mit Vorgabe rotieren
}
if (ButtonStaterueck == HIGH)
{
(Direction = "vor");
digitalWrite(LED_vor, HIGH);
digitalWrite(LED_rueck, LOW);
digitalWrite(MRueck, LOW); // Motor zurueck stopp
digitalWrite(MVor, HIGH); // Motor vor start
analogWrite(GSM1, Geschwindigkeit_vor); // Motor soll mit Vorgabe rotieren
}
// tft.fillScreen(GREEN);
// Ausgabe auf TFT
tft.fillScreen(GREEN);
int X1 = 10; // Distanz X
int Y1 = 10; // Distanz Y
int X2 = 200; //
int Y2 = 30;
int X3 = 200;
int Y3 = 50;
tft.setTextColor(RED);
tft.setTextSize(2);
tft.setCursor(X1,Y1);
tft.println("Distanz vor: "); // 1. Variable
tft.setCursor(170,Y1);
tft.print(Entfernung_vor);
tft.setCursor(X1,Y2);
tft.println("Richtung:"); // 2. Variable
tft.setCursor(170,Y2);
tft.print(Direction);
tft.setCursor(Y1, 50);
tft.println("Speed-vor:"); // 3. Variable
tft.setCursor(170,Y3);
tft.print(Geschwindigkeit_vor);
tft.setCursor(X1,70);
tft.println("Distanz rueck: "); // 1. Variable
tft.setCursor(170,70);
tft.print(Entfernung_rueck);
tft.setCursor(X1,90);
tft.println("Richtung:"); // 2. Variable
tft.setCursor(170,90);
tft.print(Direction);
tft.setCursor(X1, 110);
tft.println("Speed-zurueck:"); // 3. Variable
tft.setCursor(170,110);
tft.print(Geschwindigkeit_rueck);
// Ausgabe auf dem LCD 1
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist-V:");
lcd.print(Entfernung_vor);
lcd.print(" Dir:");
lcd.print(Direction);
lcd.setCursor(0, 1);
lcd.print("Speed-V:");
lcd.print(Geschwindigkeit_vor);
lcd.setCursor(0, 2);
lcd.print("Dist-R:");
lcd.print(Entfernung_rueck);
lcd.print(" Dir:");
lcd.print(Direction);
lcd.setCursor(0, 3);
lcd.print("Speed-R:");
lcd.print(Geschwindigkeit_rueck);
// Ausgabe auf dem LCD 2
lcd1.clear();
lcd1.setCursor(0, 0);
lcd1.print("Dist-R:");
lcd1.print(Entfernung_rueck);
lcd1.print(" Dir:");
lcd1.print(Direction);
lcd1.setCursor(0, 1);
lcd1.print("Speed-R:");
lcd1.print(Geschwindigkeit_rueck);
lcd1.setCursor(0, 2);
lcd1.print("Dist-R:");
lcd1.print(Entfernung_rueck);
lcd1.print("Dir:"),
lcd1.print(Direction);
lcd1.setCursor(0, 3);
lcd1.print("Speed-R:");
lcd1.print(Geschwindigkeit_rueck);
Serial.println ("Ausgabe auf PC:");
Serial.println ("Zeit Vor:");
Serial.println(Zeit_vor);
Serial.println("Dist-V:");
Serial.println(Entfernung_vor);
Serial.println(" Dir:");
Serial.println(Direction);
// Serial.setCursor(0, 1);
Serial.println("Speed-V:");
Serial.println(Geschwindigkeit_vor);
//Serial.setCursor(0, 2);
Serial.println("Zeit rueck:");
Serial.println(Zeit_rueck);
Serial.println("Dist-R:");
Serial.println(Entfernung_rueck);
Serial.println(" Dir:");
Serial.println(Direction);
// Serial.setCursor(0, 3);
Serial.println("Speed-R:");
Serial.println(Geschwindigkeit_rueck);
// Ausgabe auf Monitor
Serial.println ("Speed-vor:=");
Serial.println (Geschwindigkeit_vor);
Serial.println ("Dir:");
Serial.println (Direction);
Serial.println ("Distanz-Vor:");
Serial.println (Entfernung_vor);
Serial.println ("Distanz-Rueck:");
Serial.println (Entfernung_rueck);
Serial.println ("Speed-rueck:=");
Serial.println (Geschwindigkeit_rueck);
Serial.println (MVor);
Serial.println (MRueck);
if (Stop_vor==HIGH)
{ Serial.println ( "Stop Vor ausgeloest");
}
if (Stop_rueck==HIGH)
{Serial.println ( "Stop Zurueck ausgeloest");
}
if (Stop_vor==LOW)
{ Serial.println ( "Stop Vor nicht ausgeloest");
}
if (Stop_rueck==LOW)
{Serial.println ( "Stop Zurueck nicht ausgeloest");
}
Serial.println (buttonState1);
Serial.println (buttonState2);
delay(100);
switch (Entfernung_vor)
{
case 31 ... 3000:
digitalWrite(LED_Gruen_vor, HIGH);
digitalWrite(LED_Rot_vor, LOW);
digitalWrite(LED_Gelb_vor, LOW);
delay(100);
break;
case 9 ... 30:
digitalWrite(LED_Gelb_vor, HIGH);
digitalWrite(LED_Gruen_vor, LOW);
digitalWrite(LED_Rot_vor, LOW);
delay(100);
break;
case 0 ... 8:
digitalWrite(LED_Rot_vor, HIGH);
digitalWrite(LED_Gelb_vor, LOW);
digitalWrite(LED_Gruen_vor, LOW);
delay(100);
break;
switch (Entfernung_rueck)
{
case 31 ... 3000:
digitalWrite(LED_Gruen_rueck, HIGH);
digitalWrite(LED_Rot_rueck, LOW);
digitalWrite(LED_Gelb_rueck, LOW);
delay(100);
break;
case 9 ... 30:
digitalWrite(LED_Gelb_rueck, HIGH);
digitalWrite(LED_Gruen_rueck, LOW);
digitalWrite(LED_Rot_rueck, LOW);
delay(100);
break;
case 0 ... 8:
digitalWrite(LED_Rot_rueck, HIGH);
digitalWrite(LED_Gelb_rueck, LOW);
digitalWrite(LED_Gruen_rueck, LOW);
delay(100);
break;
}
}
}