Hallo @ec2021 ,
ich hatte die map Funktion ausprobiert, leider brachte sie nicht den gewünschten Erfolg.
Die Messwerte wurden zwar sauber skaliert, hatte aber ein rastendes verhalten zur Folge.
Sprich keine flüssige Bewegung des Punktes.
Die Funktion hat mir dann aber indirekt doch geholfen, da ich mir ihren Code angesehen habe. Darauf hin habe ich mir die Formeln je Sensorseite & Bedingung erstellt.
Ich denke, einiges kann man bestimmt noch schöner oder eleganter umsetzen.
Aber die Funktion was ich benötige ist somit vorhanden.
Schwellwerte lassen sich sauber einstellen und habe ein robustes Steuersignal.
Vor diesem Projekt hatte ich eine Analogwert Ermittlung & Auswertung in einer Logo.
Dies brachte aber einige Probleme mit sich...
Hier der gesamte Code sowie ein paar Bilder:
#include <U8g2lib.h>
#include <BH1750.h>
#include <Wire.h>
#define TCAADDR 0x70
#define relais1 2
#define relais2 3
#define relais3 4
#define relais4 5
BH1750 bh1750_1;
BH1750 bh1750_2;
BH1750 bh1750_3;
BH1750 bh1750_4;
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
void TCA9548A(uint8_t bus) {
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
void u8g2_prepare() {
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_logisoso32_tf);
}
void kreis_zeichnen(float x, float y, float r) {
TCA9548A(0);
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.drawLine(0, 32, 128, 32);
u8g2.drawLine(64, 0, 64, 64);
u8g2.drawFilledEllipse(x, y, r, r);
u8g2.sendBuffer();
}
void ausgabe(float sensor_x_p, float sensor_x_m, float sensor_y_p, float sensor_y_m) {
const int verz = 15;
float x, y, max_x, max_y, min_x, min_y, toleranz_x, toleranz_y, r, tolprozent;
r = 8;
tolprozent = 10; // display
toleranz_x = ((sensor_x_p + sensor_x_m) / 100) * tolprozent;
toleranz_y = ((sensor_y_p + sensor_y_m) / 100) * tolprozent;
Wire.begin();
Serial.begin(9600);
if (sensor_x_p > sensor_x_m) {
max_x = sensor_x_p;
min_x = sensor_x_m;
x = ((min_x + (max_x - min_x)) / ((max_x + min_x) / 128)) - r;
Serial.print(" X:");
Serial.print(x);
Serial.println();
} else {
max_x = sensor_x_m;
min_x = sensor_x_p;
x = ((max_x - (max_x - min_x)) / ((max_x + min_x) / 128)) + r;
Serial.print(" X:");
Serial.print(x);
Serial.println();
}
if (sensor_y_p > sensor_y_m) {
max_y = sensor_y_p;
min_y = sensor_y_m;
y = ((min_y + (max_y - min_y)) / ((max_y + min_y) / 64)) - r;
Serial.print(" Y:");
Serial.print(y);
Serial.print(" ");
} else {
max_y = sensor_y_m;
min_y = sensor_y_p;
y = ((max_y - (max_y - min_y)) / ((max_y + min_y) / 64)) + r;
Serial.print(" Y:");
Serial.print(y);
Serial.println();
}
if ((max_x - min_x <= toleranz_x) && (max_y - min_y <= toleranz_y)) {
x = 64;
y = 32;
}
kreis_zeichnen(x, y, r);
tolprozent = 20; // Relais
toleranz_x = ((sensor_x_p + sensor_x_m) / 100) * tolprozent;
toleranz_y = ((sensor_y_p + sensor_y_m) / 100) * tolprozent;
// Segel ändert Lage nicht
if ((max_x - min_x <= toleranz_x) && (max_y - min_y <= toleranz_y)) {
delay(verz);
digitalWrite(relais1, HIGH);
delay(verz);
digitalWrite(relais2, HIGH);
delay(verz);
digitalWrite(relais3, HIGH);
delay(verz);
digitalWrite(relais4, HIGH);
delay(verz);
}
// Segel im Uhrzeigersinn drehen
else if (sensor_x_m > sensor_x_p && (sensor_x_p - sensor_x_m) > toleranz_x) {
digitalWrite(relais1, HIGH);
delay(verz);
digitalWrite(relais2, LOW);
delay(verz);
digitalWrite(relais3, HIGH);
delay(verz);
digitalWrite(relais4, HIGH);
delay(verz);
}
// Segel gegen den Uhrzeigersinn drehen
else if (sensor_x_p > sensor_x_m && (sensor_x_p - sensor_x_m) > toleranz_x) {
digitalWrite(relais1, LOW);
delay(verz);
digitalWrite(relais2, HIGH);
delay(verz);
digitalWrite(relais3, HIGH);
delay(verz);
digitalWrite(relais4, HIGH);
delay(verz);
}
// Segel nach oben kippen
else if (sensor_y_p > sensor_y_m && (sensor_y_p - sensor_y_m) > toleranz_y) {
digitalWrite(relais1, HIGH);
delay(verz);
digitalWrite(relais2, HIGH);
delay(verz);
digitalWrite(relais3, LOW);
delay(verz);
digitalWrite(relais4, HIGH);
delay(verz);
}
// Segel nach unten kippen
else { //(sensor_y_m > sensor_y_p && (sensor_y_p - sensor_y_m) > toleranz_y) {
digitalWrite(relais1, HIGH);
delay(verz);
digitalWrite(relais2, HIGH);
delay(verz);
digitalWrite(relais3, HIGH);
delay(verz);
digitalWrite(relais4, LOW);
delay(verz);
}
}
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(relais1, OUTPUT);
pinMode(relais2, OUTPUT);
pinMode(relais3, OUTPUT);
pinMode(relais4, OUTPUT);
digitalWrite(relais1, HIGH);
digitalWrite(relais2, HIGH);
digitalWrite(relais3, HIGH);
digitalWrite(relais4, HIGH);
TCA9548A(0);
u8g2.begin();
u8g2_prepare();
delay(10);
TCA9548A(1);
bool communication1 = bh1750_1.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2, 0x23);
delay(10);
TCA9548A(2);
bool communication2 = bh1750_2.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2, 0x23);
delay(10);
TCA9548A(3);
bool communication3 = bh1750_3.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2, 0x23);
delay(10);
TCA9548A(4);
bool communication4 = bh1750_4.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2, 0x23);
delay(10);
}
void loop(void) {
const int verz = 5;
float sensor_x_p, sensor_x_m;
float sensor_y_p, sensor_y_m;
float toleranz_x, toleranz_y;
TCA9548A(1);
delay(verz);
sensor_x_p = (bh1750_1.readLightLevel() / 1.2) / 2;
TCA9548A(2);
delay(verz);
sensor_x_m = (bh1750_2.readLightLevel() / 1.2) / 2;
TCA9548A(3);
delay(verz);
sensor_y_p = (bh1750_3.readLightLevel() / 1.2) / 2;
TCA9548A(4);
delay(verz);
sensor_y_m = (bh1750_4.readLightLevel() / 1.2) / 2;
ausgabe(sensor_x_p, sensor_x_m, sensor_y_p, sensor_y_m);
}
Danke für deine Hilfe.
Grüße