ich habe mein erstes Arduino Projekt gestartet und habe das Problem, dass die Zykluszeit rund 4-5 Sekunden ist.
Die Aufgabe vom Arduino Nano besteht darin, einen Würfel unterschiedlich zu beleuchten.
Die verschiedenen Szenarien werden über 3 "Sensoren" eingelesen. Die Ansteuerung des LED Strips erfolgt über den PIN 2.
Der Code funktioniert grundsätzlich so, wie ich das haben möchte, jedoch reagiert das ganze sehr träge, da die Zykluszeit zu gross ist. Ich habe bereits versucht meinen Code in Funktionen zu packen und diese aufzurufen. Leider weiss ich nicht mehr weiter, wo ich meinen Code optimieren muss oder was ich falsch gemacht habe. Kann mir da jemand helfen die Zykluszeit unter 1 Sekunde zu bringen?
Ich bedanke mich bereits im Voraus für die Antworten.
//*********************************************************************************
#include <CapacitiveSensor.h>
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
CapacitiveSensor SensorAmbiente = CapacitiveSensor(4, 6);
CapacitiveSensor SensorService = CapacitiveSensor(5, 7);
CapacitiveSensor SensorZahlen = CapacitiveSensor(8, 10);
#define PIN 2
#define NUMPIXELS 16
#define led 13
#define FWZ 15 //Farbwechsel Zeit
#define TVZ 500 // Verzögerungszeit für die Berührung
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
bool AnforderungService;
bool AnforderungZahlen;
bool AnforderungAmbiente;
bool AnforderungOnOff;
bool FreigabeOnOff;
bool FaderichtungRed;
bool FaderichtungBlue;
int pos;
int r;
int g;
int b;
int w;
int x;
int GWBeruehrung; // Grenzwert für die Berührung
int incoming = 0;
long ValueAmbiente;
long ValueService;
long ValueZahlen;
long int SoftwareVersion; // Software Version
unsigned long lastMillis;
unsigned long myTimeout = 30000;
unsigned long lastMillisOnOff;
unsigned long myTimeoutOnOff = 10000;
//*********************************************************************************
//*********************************************************************************
void setup() {
Serial.begin(230400);
pinMode(led, OUTPUT);
pixels.begin();
FaderichtungRed = HIGH;
FaderichtungBlue = HIGH;
AnforderungOnOff = LOW;
FreigabeOnOff = LOW;
pos = 0;
lastMillis = 0;
lastMillisOnOff = 0;
GWBeruehrung = 200;
incoming = 0;
x = 0;
SoftwareVersion = 20220915;
}
//*********************************************************************************
//*********************************************************************************
void loop() {
Sensoren(); // Funktion Sensoren auslesen
Eingaenge(); // Funktion Eingänge verarbeiten zu Zustände
Auswahl(); // Funktion Auswahl für Pos tätigen
Ausgaenge (); // Funktion Ausgänge schreiben
incoming = EingabeSeriell(incoming); // Funktion Eingabe Seriell
if (incoming >= 1) { // Funktion Ausgabe Seriell
AusgabeSeriell();
}
else {
Serial.println("B&G: Eingabge tätigen");
}
}
//*********************************************************************************
//*********************************************************************************
void Sensoren () {
ValueAmbiente = SensorAmbiente.capacitiveSensor(30);
ValueService = SensorService.capacitiveSensor(30);
ValueZahlen = SensorZahlen.capacitiveSensor(30);
}
//*********************************************************************************
//*********************************************************************************
void Eingaenge () {
while ((ValueService >= GWBeruehrung && ValueZahlen >= GWBeruehrung) || incoming == 5 && !FreigabeOnOff) {
if (!AnforderungOnOff) {
lastMillisOnOff = millis();
AnforderungOnOff = !AnforderungOnOff;
}
else if ((millis() - lastMillisOnOff) >= myTimeoutOnOff) {
FreigabeOnOff = HIGH;
AnforderungOnOff = !AnforderungOnOff;
break;
}
}
Sensoren();
incoming = EingabeSeriell(incoming); // Funktion Eingabe Seriell
if (incoming >= 1) { // Funktion Ausgabe Seriell
AusgabeSeriell();
}
else {
Serial.println("B&G: Eingabge tätigen");
}
if ((ValueService >= GWBeruehrung || incoming == 2) && pos > 0) {
AnforderungService = HIGH;
AnforderungZahlen = LOW;
AnforderungAmbiente = LOW;
}
else if ((ValueZahlen >= GWBeruehrung || incoming == 4) && pos > 0) {
AnforderungZahlen = HIGH;
AnforderungService = LOW;
AnforderungAmbiente = LOW;
}
else if ((ValueAmbiente >= GWBeruehrung || incoming == 1) && pos > 0) {
AnforderungAmbiente = HIGH;
AnforderungService = LOW;
AnforderungZahlen = LOW;
}
}
//*********************************************************************************
//*********************************************************************************
void Auswahl() {
//--Pos 1 auswahl Ambiente--------------------------------------------------------------
if (AnforderungAmbiente) {
pos = 1;
AnforderungAmbiente = !AnforderungAmbiente;
}
//--Pos 2 auswahl Service---------------------------------------------------------------
else if (AnforderungService && !(pos == 2) && !(pos == 3)) {
lastMillis = millis();
pos = 2;
AnforderungService = !AnforderungService;
}
//--Pos 3 auswahl Service Faden ---------------------------------------------------------
else if (pos == 2 && (millis() - lastMillis) >= myTimeout && !(pos == 3)) {
pos = 3;
}
//--Pos 4 auswahl Zahlen-----------------------------------------------------------------
else if (AnforderungZahlen && !(pos == 4) && !(pos == 5)) {
lastMillis = millis();
pos = 4;
AnforderungZahlen = !AnforderungZahlen;
}
//--Pos 5 auswahl Zahlen Faden ---------------------------------------------------------
else if (pos == 4 && (millis() - lastMillis) >= myTimeout && !(pos == 5)) {
pos = 5;
}
if (FreigabeOnOff && (pos > 0)) {
pos = 0;
FreigabeOnOff = !FreigabeOnOff;
}
else if (FreigabeOnOff && (pos == 0)) {
pos = 1;
FreigabeOnOff = !FreigabeOnOff;
}
//--CASE definition---------------------------------------------------------
//Case 0 = Lampen aus (Standbay)
//Case 1 = Ambiente Beleuchtung
//Case 2 = Service Beleuchtung
//Case 3 = Service Beleuchtung Einschaltverzögerung (Faden)
//Case 4 = Zahlen Beleuchtung
//Case 5 = Zahlen Beleuchtung Einschaltverzögerung (Faden)
switch (pos) {
//(POS == 1 ) ---- Ambiente Beleuchtung ------------------------------------------------------------
case 1:
r = 255;
g = 255;
b = 255;
w = 0;
break;
//(POS == 2 ) ---- Service Beleuchtung ------------------------------------------------------------
case 2:
r = 255;
g = 0;
b = 0;
w = 0;
break;
//(POS == 3 ) ---- Service Beleuchtung Faden ------------------------------------------------------
case 3:
r = FadenRed (r);
g = 0;
b = 0;
w = 0;
break;
//(Pos == 4) ---- Zahlen Beleuchtung --------------------------------------------------------------
case 4:
r = 0;
g = 0;
b = 255;
w = 0;
break;
//(Pos == 5) ---- Zahlen Beleuchtung Faden ---------------------------------------------------------
case 5:
r = 0;
g = 0;
b = FadenBlue (b);
w = 0;
break;
// (Pos < 1) ----Beleuchtung Ausschalten -----------------------------------------------------------
default:
r = 0;
g = 0;
b = 0;
w = 0;
} // Switch abschluss
}
//*********************************************************************************
//*********************************************************************************
int FadenRed (int FadeValueRed) {
if (FadeValueRed < 30) {
FaderichtungRed = !FaderichtungRed;
}
else if (FadeValueRed > 255) {
FaderichtungRed = !FaderichtungRed;
}
if (FaderichtungRed == HIGH) {
FadeValueRed = FadeValueRed - 10;
}
else if (FaderichtungRed == LOW) {
FadeValueRed = FadeValueRed + 10;
}
return FadeValueRed;
}
//*********************************************************************************
//*********************************************************************************
int FadenBlue (int FadeValueBlue) {
if (FadeValueBlue < 30) {
FaderichtungBlue = !FaderichtungBlue;
}
else if (FadeValueBlue > 255) {
FaderichtungBlue = !FaderichtungBlue;
}
if (FaderichtungBlue == HIGH) {
FadeValueBlue = FadeValueBlue - 10;
}
else if (FaderichtungBlue == LOW) {
FadeValueBlue = FadeValueBlue + 10;
}
return FadeValueBlue;
}
//*****************************************************************************************************************************************************************************************************************
//*********************************************************************************
void Ausgaenge () {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(r, g, b)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
//*********************************************************************************
//*********************************************************************************
int EingabeSeriell (int Wert)
{
if (Serial.available() > 0) {
x = Serial.read() - 48;
if (x >= 0 && x <= 9) {
Wert = x;
}
else {
Wert == 0;
Serial.println(" ");
Serial.println("B&G: Eingabe Falsch Bitte eine Zahl von 0 bis 9 angeben");
Serial.println(" ");
}
return Wert;
}
}
//*********************************************************************************
//*********************************************************************************
void AusgabeSeriell ()
{
Serial.println(" ");
Serial.print("Aktuellwert_Sensor_Zahlen: ");
Serial.println(ValueZahlen);
Serial.print("Aktuellwert_Sensor_Service: ");
Serial.println(ValueService);
Serial.print("Aktuellwert_Sensor_Ambiente: ");
Serial.println(ValueAmbiente);
Serial.println(" ");
Serial.print("Ausgang_rot: ");
Serial.println(r);
Serial.print("Ausgang_gelb: ");
Serial.println(g);
Serial.print("Ausgang_blau: ");
Serial.println(b);
Serial.print("Ausgang_weiss: ");
Serial.println(w);
Serial.println(" ");
Serial.print("Software_Version: ");
Serial.println(SoftwareVersion);
Serial.println(" ");
Serial.print("Eingabebefehl: ");
Serial.println(incoming);
switch (pos) {
//(POS == 1 ) ---- Ambiente Beleuchtung ------------------------------------------------------------
case 1:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Ambiente Beleuchtung");
Serial.println(" ");
break;
//(POS == 2 ) ---- Service Beleuchtung ------------------------------------------------------------
case 2:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Service Beleuchtung");
Serial.println(" ");
break;
//(POS == 3 ) ---- Service Beleuchtung Faden ------------------------------------------------------
case 3:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Service Beleuchtung Faden");
Serial.println(" ");
break;
//(Pos == 4) ---- Zahlen Beleuchtung --------------------------------------------------------------
case 4:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Zahlen Beleuchtung");
Serial.println(" ");
break;
//(Pos == 5) ---- Zahlen Beleuchtung Faden ---------------------------------------------------------
case 5:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Zahlen Beleuchtung Faden");
Serial.println(" ");
break;
// (Pos < 1) ----Beleuchtung Ausschalten -----------------------------------------------------------
default:
Serial.println(" ");
Serial.print("Anlagestatus: ");
Serial.print("Ausgeschalten");
Serial.println(" ");
} // Switch abschluss
}
//*********************************************************************************
vielen dank für deine Rückmeldung.
Ich habe das pixels.show(); hinter die For Schleife gesetzt.
Dies hat ebenfalls einen minimalen Beitrag geleistet zur Verbesserung der Zykluszeit.
void Ausgaenge () {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(r, g, b)); // Moderately bright green color.
}
pixels.show(); // This sends the updated pixel color to the hardware.
}
das sieht nun wirklich gut aus - Vielen dank für die tolle Rückmeldung.
Mit der Anpassung, welche du mir angegeben hast zwinge ich nun die Software dazu die einzelnen Sensoren nur einmal pro Zyklus auszulesen. Verstehe ich das richtig?
Für mich stellt sich hier die Frage, warum hat mir das Probleme gemacht? Habe ich die Sensor Werte zu lange / zu viel ausgelesen?
Du liest jetzt mit jedem Durchlauf nur einen Sensor.
Beim nächsten Umlauf den nächsten Sensor .... und dann wieder von vorn.
Nimm mal DATEI - BEISPIELE - CapacitiverSensor - CapacitiveSensorSketch.
Da bekommst Du raus, was das auslesen aller drei an Zeit kostet und mit welchem Ergebnis.
Wenn das TimeOut zuschlägt, steht da -2 hinter jedem Sensor.
Ja, wenn irgendwas mit den Anschlüssen nicht richtig ist.
In der Lib gibt es auch debugausgaben, aber wenn der Sensor -2 aus dem example zurück gibt, dann haben wir es schon.
du hattest recht - ich habe nur einen Sensor zur Zeit am Arduino Nano. Die anderen zwei Sensoren haben mir einen Wert von -2 zurück gegeben. Als ich die zwei Sensoren deaktiviert habe, war die Zykluszeit wieder im ms Sekunden Bereich
Herzlichen Dank. das hätte ich nicht so schnell realisiert
Aehm.. das hätte Dir aber auffallen müssen, denn nach #8 hast Du jeden Sensor einzeln gelesen. Da hätte dann ein Umlauf im ms-Bereich sein müssen und 2 Umläufe im Sekundenberech....
Aber Schick, wenns funktioniert.
Dann darfst Du gerne auch wieder Deine originale Sensorroutine nehmen, wenn alle Sensoren dran sind
Wenn Du im ersten Beitrag die Überschrift von Arduino Nano auf Kapazitiver Sensor änderst und dann die Lösung anhakst, findet es auch ggfls. die Nachwelt mit der Suchfunktion des Forum.
Benutze das F() Makro: Serial.print(F("Aktuellwert_Sensor_Zahlen: "));
bei allen ausgaben von Text.
So sparst Du RAM da so der Text nicht im RAm zwischengespeichert wird.