Hi
Einige Klicks später fand ich auch einen Sketch, Den ich auf meinen Nano pressen konnte.
Da der Sensor vier 'Farben' kennt (R,G,B, alle Sensoren), habe ich den Sketch etwas erweitert, weiter habe ich die Anschlüsse an meine Gegebenheiten angepasst.
Bei mir werden Sensorwerte ausgegeben.
/* Arduino Color Sensing Tutorial
by Dejan Nedelkovski, www.HowToMechatronics.com
*/
//Quelle: https://howtomechatronics.com/tutorials/arduino/arduino-color-sensing-tutorial-tcs230-tcs3200-color-sensor/
//vom Video https://www.youtube.com/watch?v=CPUXxuyd9xw
const byte S0 = 2; //Pins an meine Gegebenheiten angepasst
const byte S1 = 3;
const byte S2 = 4;
const byte S3 = 6;
const byte sensorOut = 5;
//const byte Pin_oe = 7; //Enable, Low-Aktive
//const boolean AN = LOW;
enum farbe : byte {ROT, BLAU, GRUEN, CLEAR, crlf}; //Durcharbeiten der Farben anhand dieser Namen
const uint32_t waittime = 10;
uint16_t frequency = 0; //Ich erwarte nur positive Ergebnisse unterhalb 65536
void setup() {
pinMode(S0, OUTPUT); //Pins einstellen
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// pinMode(Pin_oe, OUTPUT); //der OE Pin (LowAktiv) macht nicht ganz, was ich erwartet habe, daher auskommentiert
pinMode(sensorOut, INPUT);
// Setting frequency-scaling to 20% - siehe Datenblatt des Sensor
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
// digitalWrite(Pin_oe, AN);
Serial.begin(9600);
}
void loop() {
// digitalWrite(Pin_oe, millis() % 1000 < 500); //sollte eigentlich die LEDs des Sensor laufend an/aus schalten
static byte farbwahl = farbe::ROT; //wir beginnen mit dem roten Sensor
static uint32_t lastmillis = 0; //letzte gemerkte Zeit
static boolean doread = false; //sollen wir einen Farbwert lesen?
static byte temp = 0; //Variable, um zwischen den Anzeigen mehr Leerzeit zu haben
switch (farbwahl) {
case ROT:
if (millis() - lastmillis < waittime) break; //ist die Wartezeit zwischen den Messungen bereits um?
lastmillis = millis(); // bei Nein, wird per break; die switch-Abfrage verlassen, sonst 'neue Zeit merken'
Serial.print("R="); //Ausgabe Terminal
// Setting red filtered photodiodes to be read
digitalWrite(S2, LOW); //Sensor auf diesen Filter einstellen
digitalWrite(S3, LOW);
farbwahl = GRUEN; //nächsten Sensor einstellen
doread = true; //Lesen auslösen
break;
case GRUEN:
if (millis() - lastmillis < waittime) break; // ... das Gleiche 'in Grün' :) - also bei allen Filtern
lastmillis = millis();
Serial.print("G=");
// Setting Green filtered photodiodes to be read
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
farbwahl = BLAU;
doread = true;
break;
case BLAU:
if (millis() - lastmillis < waittime) break;
lastmillis = millis();
Serial.print("B=");
// Setting Blue filtered photodiodes to be read
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
farbwahl = CLEAR;
doread = true;
break;
case CLEAR:
if (millis() - lastmillis < waittime) break;
lastmillis = millis();
Serial.print("C=");
// Setting without filtered photodiodes to be read
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
farbwahl = crlf; //Als Nächstes Zeilenumbruch (und Wartezeit)
doread = true;
break;
case crlf:
if (temp == 0) { //erster Aufruf?
temp = 100; //JA, 100x Warten
break;
} else {
if (millis() - lastmillis < waittime) break; //in den 100x Warten: Wartezeit vorbei? Nein->break
}
lastmillis = millis(); //Sonst aktuelle Zeit merken
temp--; //und Wert um 1 senken
if (temp == 0) { //sind wir auf 0
Serial.println(); //Zeilenumbruch zum Terminal
farbwahl = ROT; //nächste Messung wieder Rot
}
}
if (doread) { //Sollen wir Farbwert auslesen?
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW); //Zeit des PWM-Signal messen
// Printing the value on the serial monitor
Serial.print(frequency);//printing RED color frequency
Serial.print(" ");
doread = false; //und 'merken', daß wir Nichts auslesen - bis zum nächsten Sensor
}
}
Beim 'in die Luft starren' zeigt Er Folgendes:
23:47:34.501 -> R=181 G=216 B=195 C=62
23:47:35.533 -> R=169 G=209 B=191 C=60
23:47:36.611 -> R=178 G=215 B=193 C=61
23:47:37.642 -> R=175 G=213 B=195 C=62
23:47:38.673 -> R=171 G=209 B=190 C=60
23:47:39.705 -> R=183 G=216 B=196 C=61
23:47:40.783 -> R=173 G=213 B=192 C=60
23:47:41.814 -> R=177 G=213 B=193 C=61
23:47:42.845 -> R=174 G=213 B=192 C=61
MfG
Edit
... etwas am Sketch gespielt - man könnte jetzt noch andere Dinge in loop() erledigen.
... Kommentare - was man selber sehen will, sollte man Anderen auch zu Lesen geben ...