Guten Abend liebe Community,
anbei habe ich einen Code, welcher 4 Lux Sensoren über einen TCA9548A I2C Mulitplexer am Arduino Mega ausliest. Dies funktioniert, ich möchte aber jetzt erstmal mich um die Y Achse kümmern also bitte nicht wundern warum es im code erstmal nur um zwei sensoren geht.
Jetzt zum Problem:
Ich habe ein Sonenpanel auf eine Achse gebaut, welches sich durch die Lux Sensoren zur Sonne ausrichten. Es funktioniert alles nur bleibt mein Motor nicht stehen. Er dreht von rechts nach links, und sobald das licht an einem Sensor weg geht, dreht er sich wieder in die andere Richtung. Es geht mir also nur um die If abfragen im Code. Mir ist bewusst dass das Programm nicht bei Motor stopp stehen bleibt. Ich habe versucht eine Bool Variabel einzubauen welche aktiv bleibt solang die Lux Werte sich nähern, habs nicht hinbekommen. Dann mit einer While Schleife... hab ich auch nicht hinbekommen (wobei das schon besser funktioniert hat, aber meine Lux Werte wurden nicht mit in die Schleife übernommen.
Vielen dank im Vorraus
Grüße
Stefan
Hier mein erster Code
#include <Wire.h>
#define TCA9548A_ADDRESS 0x70
#define BH1750_ADDRESS 0x23
// Pin-Definitionen für den Motor
const int ENA = 7;
const int IN1 = 5;
const int IN2 = 6;
const int IN3 = 8;
const int IN4 = 9;
const int ENB = 10;
void setup() {
Serial.begin(9600);
Wire.begin();
// Initialisierung des Motors
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
}
void loop() {
// Kanal 0
Wire.beginTransmission(TCA9548A_ADDRESS);
Wire.write(1 << 0); // Kanal 0 aktivieren
Wire.endTransmission();
delay(100);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.write(0x10); // Kontinuierliche Hochauflösungsmessung einschalten
Wire.endTransmission();
delay(200);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.requestFrom(BH1750_ADDRESS, 2);
int luxValue1 = 0;
if (Wire.available() == 2) {
uint16_t luxValue = Wire.read() << 8;
luxValue |= Wire.read();
luxValue1 = luxValue;
}
Wire.endTransmission();
// Kanal 1
Wire.beginTransmission(TCA9548A_ADDRESS);
Wire.write(1 << 1); // Kanal 1 aktivieren
Wire.endTransmission();
delay(100);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.write(0x10); // Kontinuierliche Hochauflösungsmessung einschalten
Wire.endTransmission();
delay(200);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.requestFrom(BH1750_ADDRESS, 2);
int luxValue2 = 0;
if (Wire.available() == 2) {
uint16_t luxValue = Wire.read() << 8;
luxValue |= Wire.read();
luxValue2 = luxValue;
}
Wire.endTransmission();
// Entscheidung über die Motorrichtung
if (luxValue1 > luxValue2) {
Serial.println("Sensor 1 hat mehr Licht, der Motor dreht sich nach rechts,Panel links");
Serial.print("Lux-Wert Sensor 1: ");
Serial.println(luxValue1);
Serial.print("Lux-Wert Sensor 2: ");
Serial.println(luxValue2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 150);
analogWrite(ENB, 150);
} else if (luxValue2 > luxValue1) {
Serial.println("Sensor 2 hat mehr Licht, der Motor dreht sich nach links,Panel rechts");
Serial.print("Lux-Wert Sensor 1: ");
Serial.println(luxValue1);
Serial.print("Lux-Wert Sensor 2");
Serial.println(luxValue2);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 150);
analogWrite(ENB, 150);
} else if (luxValue1 - luxValue2 < 200) {
Serial.println("Beide Sensoren haben den gleichen Lichtwert, der Motor stoppt");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
}
Hier der Code mit Schleife: Wie gesagt es geht mir um den Motorstopp wenn die Lux werte differenz kleiner gleich 200
#include <Wire.h>
#define TCA9548A_ADDRESS 0x70
#define BH1750_ADDRESS 0x23
// Pin-Definitionen für den Motor
const int ENA = 7;
const int IN1 = 5;
const int IN2 = 6;
const int IN3 = 8;
const int IN4 = 9;
const int ENB = 10;
void setup() {
Serial.begin(9600);
Wire.begin();
// Initialisierung des Motors
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
}
void loop() {
// Kanal 0
Wire.beginTransmission(TCA9548A_ADDRESS);
Wire.write(1 << 0); // Kanal 0 aktivieren
Wire.endTransmission();
delay(100);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.write(0x10); // Kontinuierliche Hochauflösungsmessung einschalten
Wire.endTransmission();
delay(200);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.requestFrom(BH1750_ADDRESS, 2);
int luxValue1 = 0;
if (Wire.available() == 2) {
uint16_t luxValue = Wire.read() << 8;
luxValue |= Wire.read();
luxValue1 = luxValue;
}
Wire.endTransmission();
// Kanal 1
Wire.beginTransmission(TCA9548A_ADDRESS);
Wire.write(1 << 1); // Kanal 1 aktivieren
Wire.endTransmission();
delay(100);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.write(0x10); // Kontinuierliche Hochauflösungsmessung einschalten
Wire.endTransmission();
delay(200);
Wire.beginTransmission(BH1750_ADDRESS);
Wire.requestFrom(BH1750_ADDRESS, 2);
int luxValue2 = 0;
if (Wire.available() == 2) {
uint16_t luxValue = Wire.read() << 8;
luxValue |= Wire.read();
luxValue2 = luxValue;
}
Wire.endTransmission();
while (abs(luxValue1 - luxValue2) > 200) {
// Entscheidung über die Motorrichtung
if (luxValue1 > luxValue2) {
Serial.println("Sensor 1 hat mehr Licht, der Motor dreht sich nach rechts,Panel links");
Serial.print("Lux-Wert Sensor 1: ");
Serial.println(luxValue1);
Serial.print("Lux-Wert Sensor 2: ");
Serial.println(luxValue2);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENA, 150);
analogWrite(ENB, 150);
} else if (luxValue2 > luxValue1) {
Serial.println("Sensor 2 hat mehr Licht, der Motor dreht sich nach links,Panel rechts");
Serial.print("Lux-Wert Sensor 1: ");
Serial.println(luxValue1);
Serial.print("Lux-Wert Sensor 2");
Serial.println(luxValue2);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENA, 150);
analogWrite(ENB, 150);
}
}
// Der Motor stoppt
Serial.println("Beide Sensoren haben den gleichen Lichtwert, der Motor stoppt");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
