Ein Versuch.
Alle defines getauscht.
Wenn trotzdem noch "Display nicht gefunden" ausgegeben wird, wird es schwierig.
// =============================== Arduino 1 ===============================
//== I2C ==
#include <Wire.h>
#include <SPI.h>
const byte I2C_DISPLAY = 0x3C; // Adresse OLED-Display
const byte I2C_FARBSENSOR = 0x10; // Adresse Farbsensor
//== I2C Display ==
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);
//== I2C Farbsensor ==
#include "veml6040.h"
VEML6040 Farbsensor;
#include <SoftwareSerial.h>
const byte softSerRX = 10;
const byte softSerTx = 11;
SoftwareSerial softserial(softSerRX, softSerTx); // RX, TX
//== FARBSENSOR LED ==
#include <FastLED.h>
const byte NUM_LEDS = 13;
const byte DATA_PIN = 7;
#include <DFRobot_HX711.h>
const byte hxOut = 3;
const byte hxClk = 5;
DFRobot_HX711 waage(hxOut, hxClk);
const byte Taster = 2; // Taster Pin
CRGB RING[NUM_LEDS];
bool automatik = false; // flag, um zwischen Automatik und Normal umzuschalten
bool messung_waage = false; // flag, ob Gewichtsmessung schon gemacht wurde
bool messung_farb = false; // flag, ob Farbmessung schon gemacht wurde
String inputString = ""; // Speichert eingehende daten
bool stringComplete = false;
void setup()
{
pinMode(Taster, INPUT_PULLUP);
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(RING, NUM_LEDS).setCorrection(TypicalLEDStrip);
fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
FastLED.show();
init_Serial();
init_farbsensor();
init_display();
init_waage();
}
void loop()
{
auswertung_taster(); // Taster
auswertung_farbe(); // Farbsensor
auswertung_waage(); // Waage
}
void init_display()
{
// Serial.println("Initialisierung Display");
if (display.begin(SSD1306_SWITCHCAPVCC, I2C_DISPLAY) == false)
Serial.println(F("ERROR: Display nicht gefunden. Bitte Anschlüsse prüfen!"));
display.display();
delay(2000);
display.clearDisplay();
}
void d_print(String text, uint8_t x, uint8_t y, uint8_t groesse, boolean clear)
{
if (clear == true) // will nicht immer das Display komplett löschen
display.clearDisplay();
else
{
fest(); // Feste Texte, die immer auf dem Display stehen sollen
display.setTextSize(groesse);
display.setTextColor(SSD1306_WHITE); // Schrift weiss
display.setCursor(x, y); // position
display.print(text);
display.display();
display.setTextSize(1); // Normal 1:1
}
}
void fest()
{
display.clearDisplay();
display.setCursor(0, 0);
display.setTextColor(SSD1306_WHITE); // Draw white text
display.print(F("Automatik: "));
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
automatik ? display.println(F("An")) : display.println(F("Aus"));
}
void init_farbsensor()
{
// Serial.println("Initialisierung Farbsensor...");
if (Farbsensor.begin() == false)
Serial.println("ERROR: Sensor nicht gefunden. Bitte Anschlüsse prüfen!");
else
Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE);
}
void auswertung_farbe()
{
if (messung_farb == true) // nur Messen, falls taster gedrückt
{
switch (Farb_Messung()) // Erst Messen, dann ausweten
{
case 0: // Rot
Serial.println("ROT");
d_print("ROT", 45, 25, 2, true);
d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
// senden ("pin 02 OUT HIGH");
break;
case 1: // Grün
Serial.println("GRUEN");
d_print("GRUEN", 32, 25, 2, true);
d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
// senden ("pin 03 OUT HIGH");
break;
case 2: // Blau
Serial.println("BLAU");
d_print("BLAU", 38, 25, 2, true);
d_print("WUERFEL WIRD SORTIERT ", 0, 50, 1, false);
// senden ("pin 04 OUT HIGH");
break;
case 3: // Farbe nicht eindeutig
Serial.println("FARBE NICHT EINDEUTIG");
d_print("Ergebnis: \n NICHT EINDEUTIG!", 0, 30, 1, true);
// senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
break;
default: // Messung noch nicht erfolgt
Serial.println("MESSUNG NICHT ERFOLGT");
d_print("MESSUNG NICHT ERFOLGT \nODER FEHLGESCHLAGEN", 0, 30, 1, true);
// senden ("LOW "); // Keine Messung erfolt, also alle Pins LOW
break;
}
messung_waage = true; // Würfel wurde sortiert, also einmal Gewicht messen
}
}
uint8_t Farb_Messung()
{
uint16_t roh_rot[10] = {0}; // Array für alle Farben anlegen
uint16_t roh_gruen[10] = {0};
uint16_t roh_blau[10] = {0};
uint16_t rot = 0; // Variablen für durchnittswert
uint16_t gruen = 0;
uint16_t blau = 0;
d_print("Farbmessung...", 10, 30, 1, true);
fill_solid(RING, NUM_LEDS, CRGB(100, 100, 200)); // LEDS für die Farbmessung einschalten
FastLED.show();
for (uint8_t i = 0; i < 10; i++) // Sensor 10x Lesen
{
Farbsensor.setConfiguration(VEML6040_IT_80MS + VEML6040_TRIG_ENABLE + VEML6040_AF_FORCE + VEML6040_SD_ENABLE); // muss nach jeder Messung neu definiert werden, da Trigger mode
delay(90); // warte etwas mehr als 80ms
roh_rot[i] = Farbsensor.getRed(); // Daten in Array speichern
roh_blau[i] = Farbsensor.getBlue();
roh_gruen[i] = Farbsensor.getGreen();
// Serial.print("ROHDAETN: Rot ");
// Serial.print(roh_rot[i]);
// Serial.print(" blau ");
// Serial.print(roh_gruen[i]);
// Serial.print(" gruen ");
// Serial.println(roh_blau[i]);
}
for (uint8_t i = 0; i < 10; i++) // Daten aufaddieren
{
rot += roh_rot[i];
blau += roh_blau[i];
gruen += roh_gruen[i];
}
// Sensor mittelwert bilden
rot = rot / 10;
gruen = gruen / 10;
blau = blau / 10;
// Serial.print("MITTELWERT: Rot ");
// Serial.print(rot);
// Serial.print(" blau ");
// Serial.print(blau);
// Serial.print(" gruen ");
// Serial.println(gruen);
messung_farb = false; // messung erledigt
fill_solid(RING, NUM_LEDS, CRGB::Black); // LEDS für die Farbmessung ausschalten
FastLED.show();
// Auswerten welche Farbe und an Funktion zurückgeben
if ((rot > gruen) && (rot > blau)) // rot
return 0;
else if ((gruen > rot) && (gruen > blau)) // grün
return 1;
else if ((blau > gruen) && (blau > rot)) // blau
return 2;
else // Farbe nicht eindeutig (Sehr unwahrscheinlich)
return 3;
}
void init_Serial()
{
Serial.begin(115200);
softserial.begin(4800);
}
void senden(String text)
{
softserial.println("LOW "); // "LOW " schaltet alle Pins auf LOW
softserial.println(text);
delay(10);
}
void auswertung_serial()
{
while (softserial.available())
{
char inChar = (char)softserial.read(); // neues Byte erhalten:
inputString += inChar; // zum inputString hinzufügen:
if (inChar == '\n') // wenn das eingehende Zeichen ein Zeilenumbruch ist, ein Flag setzen
stringComplete = true;
}
if (stringComplete) // Stringcomplete heißt neue Zeile wurde empfangen
{
if (inputString.substring(0, 1) == "A")
messung_farb = true; // Kuka hat Rückmeldung gegeben, dass er am Farbsensor ist
// else if (inputString.substring(0, 1) == "B");
// else if (inputString.substring(0, 1) == "C");
inputString = ""; // String leeren
stringComplete = false;
}
}
void auswertung_taster()
{
static bool wechsel = false; // wechseln zwischen Automatik und Normalbetrieb
if (Tasterstatus()) // wenn Taster gedrückt
{
messung_farb = true;
messung_waage = true;
if (wechsel)
{
automatik = true;
wechsel = false;
}
else
{
automatik = false;
wechsel = true;
}
}
}
bool Tasterstatus() //== Taster ==
{
static bool Taster_status; // Flankenerkennung: true = gedrückt
bool Taster_gedrueckt = !digitalRead(Taster);
if ((Taster_gedrueckt) && (!Taster_status)) // Taster wurde gedrückt
{
Taster_status = true; // Taster staus true, da gedrückt
delay(5); // entprellen
return true; // Rückgabeweet für Sollwert
}
if ((!Taster_gedrueckt) && (Taster_status)) // Taster wurde losgelassen
{
Taster_status = false; // Taster staus false, da losgelassen
delay(5); // entprellen
return false; // Rückgabewert für Sollwert
}
return false; // Falls kein Taster gedrückt wurde
}
void init_waage()
{
// Serial.println("Initialisierung Waage");
// if (!waage.is_ready())
// Serial.println("Waage nicht gefunden");
waage.setCalibration(1992);
}
void auswertung_waage()
{
if (messung_waage) // nur Gewicht messen wenn kuka einen würfel sotiert hat
{
Serial.print(waage.readWeight());
Serial.println(" g");
if (waage.readWeight() >= 3) // Durchschnitt von 10 Messwerten minus des Taragewichts
{
if (automatik)
{
// senden ("pin 05 OUT HIGH");
}
else
{
// senden ("LOW "); // Kein Automatikmodus, also alle Pins LOW
// d_print("Behaelter voll! \nBitte entleeren und quittieren", 5, 30, 2, true);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE); // Schrift weiss
display.setCursor(1, 5); // position
display.print(F("Behaelter\n Voll!"));
display.setTextSize(1);
display.setCursor(0, 45);
display.print(F("Bitte entleeren und quittieren!"));
display.display();
while (!Tasterstatus()); // Erst weiter, wenn Taster gedrückt
}
}
messung_waage = false; // Gewicht wurde gemessen
}
}