Smartphone (Bluetoth) -> Arduino -> 2Arduinos - (Wie kann das Setup gestalten?)

Hallo,

Ich bin kein Programmierer und erst sein 1 Monat in der Aurduino-Welt. Dieses Projekt ist wohl etwas zu komplex für mein derzeitiges Niveau, aber ich habe ein Herzensprojekt das ich unbedingt umsetzten möchte. Bitte um Verständnis.

Die einzelen Funktionen laufen bereits im Großen und Ganzen (Ansteuerung der LED-Panele, Ansteuerung des Motors, etc..)
Wo ich Unterstützung bräuchte ist beim Zusammenspiel aller Komponenten.

zu steuerne Hardware:

  • 1 Robotormotor über UART Schnittstelle
    Starte Motorprogramm 1, 2, 3 ( automatisierter Ablauf vordefinierter Umdrehungsgeschwindigkeiten für ca 15min.)
    (zB. 20 Umdrehungen mit 200 RPM, dann 15 x mit 250 RPM, dann 25x mit 130 RP, usw....)
  • 2 LED-Panele (NeoPixel)
    Ledprogramm 1, 2 und 3 (automatische Abfolge vordefinierte Blinkfrequenzen in Abhängikgeit des gewählten Motorprogramms) (zB 50 x blinken mit: ( LED 100ms ON, dann LED 100mx OFF), danach 70 x (150ms ON, dann 150 ms OFF), usw...) für ca. 15 min.

Funktionen am Smartphone:

  • Herstellen der Bluetoothverbindung zum Arduino #1: Funktioniert

  • Senden von Befehlen an vom Smartphone an den Auduino #1: Funktioniert

  • Start vordefinierte Motorprogramme 1, 2 oder 3 (optional mit oder ohne LED)
    lf LED=ON; Start Motorporgramm 1+ LED-Programml; eise: Start Motorprogramm 1(ohne LED)

  • laufendes Motor-Programm und LED-Programm pausieren und vorzeitig abbrechen: FEHLT

Meine Fragen:

  • Ich habe Tutorials gefunden die zeigen wie man zwei Aruduinos über TX und RX verbindet,
    ABER laut den anderen Tutorials muss ich auch den Bluetoothreceiver und die 2 LED-Panele über TX und RX anstecken. An diesem Punkt steige ich völlig aus und habe keine Ahnung wie ich alleine weierkomme.

  • Wie viele Arduinos benötige ich um das Projekt zum Laufen zu bringen?

  • Wie muss ich die Teile miteinander verbinden? (Welche Plns verwenden?)
    Smartphone (Bluetooth) <---> Arduino 1 (Arduino Mini?
    | |
    Arduino2 Arduino3
    Start/Pause/Stop Motor-Funktion Start/Pause/Stop 2 LED-Panels

Danke für eure Unterstützung!

Hallo
zeige bitte zusätzlich ein Blockschaltbild mit allen Bauelelementen und eine einfache Beschreibung in der du den Funktionsablauf einfach, in nicht geschachtelten Sätzen, beschreibst.
Was passiert wo, wie, warum und weshalb? SESAMSTRASSE :slight_smile:

Ich hoffe dieses Bild beschreibt worum es geht.
Jedes Programm dauert ca 15 Minuten.
Fehlt noch mehr information?

Hallo
und danke für das super Blockschaltbild, inklusive Beschreibung. KARMA++.
Hierzu habe ich eine Frage:
Warum verwendest du viermal eine Arduino-Hardware?
Ist für das Projekt mit einer Arduino-Hardware realisierbar , auf der die Sketche zusammengefasst laufen ?

Hallo paulpaulson,
Umso besser, wenn das mit nur einem Arduino funktioniert. Mein bisheriger Wissensstand war, dass man mit Arduino nur einen Prozess gleichzeitig ablaufen lasen kann. Ich habe das so verstanden, dass Befehle für Motor, LED-Pannel 1 und LED-Pannel 2 dann ineinander verschachtelt zu schreiben sind.

z.B.
An LED 1: für 100 ms (Millisekunden) ON
An LED 2: für 90 ms ON
An Motor: Starte mit 120 RPM
An Motor: Schick mir Rückmeldung wie viele Umdrehungen du machst
An LED 2: für 90 ms OFF
An LED 1. für 100 ms 0FF
An Motor: Schick mir Rückmeldung wie viele Umdrehungen du machst
An LED 2: ...
An LED 1: ...

Und dieser Aufbau des Codes scheint mir für diesen Fall unmöglich.

Ich denke ich bräuche die Möglichkeit den Code eines jeden Hardwareteils in einem Block zusammenzufassen und ich dachte, dass auf einem Aurduino nur ein solcher Block pro Arduino Platz hat.

z.B.
LED 1:

  • repeat 10x (100 ms ON, 100 ms OFF)
  • 20x (170 ms ON, 170 ms OFF)
  • 17x (120 ms ON, 120 ms OFF)
  • usw..... (für rund 15 Minuten)

LED 2: ähnlch wie LED 1

Motor:

  • An Motor: Starte mit 120 RPM
  • An Motor: Schick mir Rückmeldung wie viele Umdrehungen du machst (in einer Loop-Funktion um laufend Rückmeldungen zu erhalten)
  • Wenn 50 Umdrehungen erreicht sind: -> Befehl an Motor: Bewege dich mit 220 RPM
  • usw... (für rund 15 Minuten)

Wie könnte man das in einem Arduino realiiseren? Wo finde ich Tutorials dazu?
Wie kann man das umsetzten, dass bei Bedarf alle 3 Hardwareteile ihre Funktion pausieren, pausieren-beenden, bzw. stoppen?

Danke.

Moin
Sketche können "quasi" zeitgleich ablaufen, die Abarbeitung erfolgt ereignisgesteuert nacheinander, so das der Eindruck entsteht das diese zeitgleich ablaufen.
Einen Link zu einem Tutorial habe ich nicht griffbereit, aber im weltweiten Netz wird man zum Thema bestimmt fündig werden.
Und wenn nicht, dann kann ich in meiner Sketchkiste suchen und dir einen Sketchrahmen für deine Sketche für Arduino1 bis Arduino4 zusammenschrauben.

Du brauchst das ganze nur ohne delay programmieren.
Das Grundverständnis zeigt dir "BlinkWithoutDelay"
Bringe zwei LEDs zum unabhängigen Blinken.

Dann schreibe mal den
Ablauf einfach untereinander was in welcher Reihenfolge / mit welchem Zeitlichen Abstand passieren soll.
Wodurch wird der Ablauf gestartet?
Wodurch wird der Ablauf beendet?

Vergiss mal wie viele Arduinos das sind, betrachte nur die Elemente /Leds/Pixel/Motoren.

Schlussendlich werden wir versuchen, das auf so wenig Arduinos wie möglich unterzubringen, weil
Zwei Arduinos -> ein Problem
Drei Arduinos -> zwei Probleme!

Das ganze ist dann eine Ablaufkette/Endlicher Automat/Finite State Machine.

Das ist ja eine gute Nachricht, dass man das mit einem Arduino realisieren kann. :smiley:

Was ich gerade gelesen habee, kann man dann kein delay verwenden, weil das dann den gesamten Prozess aufhalten würde, richtig?
delay(100); muss ich dann ersetzen durch: mills(100); richtig?

Wenn du mir so einen Sketchrahmen zusammenschrauben könntest wäre das wunderbar. Ich wäre dir sehr dankbar dafür.

Hallo
wie schon von noiasca erwähnt studiere das IDE Beispiel BLINKWITHOUTDELAY

Danke noiasca,

Du brauchst das ganze nur ohne delay programmieren.
Das Grundverständnis zeigt dir "BlinkWithoutDelay"
Bringe zwei LEDs zum unabhängigen Blinken.

Ich werde das glieich mal ansehen und nachbauen. Danke!

https://forum.arduino.cc/index.php?topic=423688.0
Hier ist das ganze für Anfänger wie mich erklärt anhand eines Nachtwächterbeispiels.
Ich werde mir das genauer ansehen und euch dann Bescheid geben.
Danke einstweilen!

Ihr seid der Hit, danke. Ich habe es aber noch nicht ganz geschafft.

Dank der Nachtwächtererklärung habe ich es begonnen zu verstehen.
https://forum.arduino.cc/index.php?topic=423688.0

Ich habe es geschaftt 2 einzelne LED mit unterschiedlichen Blinkgeschwinigkeiten zu programmieren.
Hier erstmal der Code:

unsigned long LED1_timestore;  // Variable Speicher für Systemzeit.
int Led1_Status = LOW;
int Led1_Pin = 13;

unsigned long LED2_timestore;  // Variable Speicher für Systemzeit.
int Led2_Status = LOW;
int Led2_Pin = 12;

void setup() {
  pinMode(Led1_Pin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
  pinMode(Led2_Pin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.

}

void loop() {

/* LED-1 ============================ */
  if (Led1_Status == LOW) {
    if (millis() - LED1_timestore> 1000 ) {
      digitalWrite(Led1_Pin, HIGH);
      LED1_timestore = millis();
      Led1_Status = HIGH;
    }
  } else {
    if (millis() - LED1_timestore> 500) {
      digitalWrite(Led1_Pin, LOW);
      Led1_Status = LOW;
    }
  }
/* LED-1 - ENDE ====================== */



/* LED-2 ============================ */
  if (Led2_Status == LOW) {
    if (millis() - LED2_timestore> 2000 ) {
      digitalWrite(Led2_Pin, HIGH);
      LED2_timestore = millis();
      Led2_Status = HIGH;
    }
  } else {
    if (millis() - LED2_timestore> 500) {
      digitalWrite(Led2_Pin, LOW);
      Led2_Status = LOW;
    }
  }
/* LED-2 - ENDE ====================== */
}

Die Adaptierung an mein LED-Panel funktioniert noch nicht.

Hier der funktionierende Code zur Ansteuerung eines LED-Pannels mit delay

/* Mithilfe des Arduino-Forums erstellt */

/*
// Zur Nachahmung:
// 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
// Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
// Die zwei anderen Kabel bei GRN und bei 5V hineinstecken.
// In der Zeile "#define NUM_LIGHTS  64" die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen
// Farbe abändern: In der Zeile "uint32_t high = strip.Color(5, 0, 0);" die Werte in der Klammer abändern (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
// Blinkgeschwindigkeit in diesen zwei Zeilen zu ändern "delay(15);" (Wert in Millisekungen; 1000 = 1 Sekunde)
*/


#include <Adafruit_NeoPixel.h>    // 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
#define PIN 8                     // Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
#define NUM_LIGHTS  64            // Die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LIGHTS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
    uint32_t low = strip.Color(0, 0, 0); 
    uint32_t high = strip.Color(5, 0, 0);  // Hier die Lichtfarbe abändern. (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
  
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, high);
    }   
    strip.show();
    
    delay(100); // Zeitdauer in der das Licht an ist.
    
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, low);
        // strip.show();
    }   
    strip.show();
        
     delay(100);  // Zeitdauer in der das Licht aus ist.
}

Hier mein Versuch ein LED-Pannel mit millis zu steuern. Ich bekomme eine Fehlermeldung
Hier der Code:

/* Quelle einzelne LEDs ohne delay zu steuern  =================================== */
unsigned long LED1_timestore;  // Variable Speicher für Systemzeit.
int Led1_Status = LOW;
int Led1_Pin = 8;
/* Quelle ENDE =================================== */

/* Mithilfe des Arduino-Forums erstellt */

/*
// Zur Nachahmung:
// 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
// Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
// Die zwei anderen Kabel bei GRN und bei 5V hineinstecken.
// In der Zeile "#define NUM_LIGHTS  64" die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen
// Farbe abändern: In der Zeile "uint32_t high = strip.Color(5, 0, 0);" die Werte in der Klammer abändern (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
// Blinkgeschwindigkeit in diesen zwei Zeilen zu ändern "delay(15);" (Wert in Millisekungen; 1000 = 1 Sekunde)
*/

#include <Adafruit_NeoPixel.h>    // 1. Adafruit_NeoPixel.h Bibliothek (Library) importieren.
#define PIN 8                     // Daten Pin 8 verwenden oder in der Zeile "#define PIN 8" die Zahl 8 abändern, je nach verwendetem Pin
#define NUM_LIGHTS  64            // Die Zahl 64 entspricht der Anzahl der LEDs - bei Bedarf die Zahl anpassen

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LIGHTS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
/* Quelle einzelne LEDs ohne delay zu steuern  =================================== */
  pinMode(Led1_Pin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
/* Quelle ENDE =================================== */
  
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {

/* Quelle einzelne LEDs ohne delay zu steuern  =================================== */

 if (Led1_Status == LOW) {
    if (millis() - LED1_timestore> 1000 ) {
 /*     digitalWrite(Led1_Pin, HIGH);
      LED1_timestore = millis();
      Led1_Status = HIGH; */

          uint32_t low = strip.Color(0, 0, 0); 
    uint32_t high = strip.Color(5, 0, 0);  // Hier die Lichtfarbe abändern. (Rot, Grün, Blau) (Werte zwischen 0-255 verwenden)
  
    for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, high);
    }   
    strip.show();
    
    }
  } else {
    if (millis() - LED1_timestore> 500) {
/*      digitalWrite(Led1_Pin, LOW);
      Led1_Status = LOW;
      */
      for( int i = 0; i<NUM_LIGHTS; i++){
        strip.setPixelColor(i, low);
        // strip.show();
    }   
    strip.show();
    }
  }
/* Quelle ENDE =================================== */  
}

Hier die Fehlermeldung:
Folgende Code-Zeile ist im Arduino-Programm rot hinterlegt:

strip.setPixelColor(i, low);

Die dazugehörige Fehlermeldung lautet:

exit status 1
'low' was not declared in this scope

Könnt Ihr mir sagen was da falsch ist? Danke!

Hallo
mach mal aus den "low" ein "LOW" :slight_smile:

Danke paulpaulson,

der Fehler ist jetzt weg. Es funktioniert aber noch nicht.
Es gehen zwar alle LEDs de Pannels an, aber nicht aus.

Ich habe grade gesehen, dass das so nicht geht wie ich es gemacht habe. Ich verstehe zwar noch nicht wie es richtig geht, aber ich werde versuchen es rauszufinden.

DAUMEN HOCH

also eine Variable uint32_t high als Farbcode würde ich allein schon wegen der Gefahr einer eventuellen Verwechslung nicht machen.

was ist es ? eine Farbe
wozu? zum Fülllen

uint32_t colorFill= strip.Color(5, 0, 0);

Außerdem, haben wir die Tage nicht mal über fill gesprochen?

void fill(uint32_t c=0, uint16_t first=0, uint16_t count=0);

also z.B.

strip.fill(colorFill);

ganz ohne for loop.

übrigens, so wie es ein fill gibt, gibt es auch ein clear() ohne weitere Parameter!

Kenne dein Werkzeug --> Kenne deine Library!

@noiasca,

Ja, du hast mir vor kurzem über *strip.fill(color, first, count); * geschrieben

https://forum.arduino.cc/index.php?topic=719085.msg4838447#msg4838447

Ich habe es nicht geschafft das uint32_t high durch strip.fill(color, first, count); zu ersetzen, deshalb bin habe ich es so belassen, es funktioniert ja trotzdem funktioniert.

Kenne dein Werkzeug --> Kenne deine Library!

Ich bemühe mich.

diese zwei Methoden ersetzen das einzelne setzen in der For Schleife.
Grad ausprobiert - funktioniert einwandfrei:

// demo von fill und clear
// https://forum.arduino.cc/index.php?topic=721118.msg
// by noiasca

#include <Adafruit_NeoPixel.h>
#define LED_PIN    12
#define LED_COUNT 60
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)

  uint32_t colorFill = strip.Color(5, 0, 0);   // 5 ist sehr wenig, das kann evtl. nicht sichtbar sein.
  strip.fill(colorFill);
  strip.show();
  delay(2000);
  
  strip.clear();
  strip.show();
  delay(2000);

  colorFill = 0x00FF00;
  strip.fill(colorFill);
  strip.show();
  delay(2000); 

  strip.clear();
  strip.show();
  delay(2000);

  colorFill = 0x0000FF;
  strip.fill(colorFill);
  strip.show();
}


// loop() function -- runs repeatedly as long as board is on ---------------

void loop() {
}

Hallo,

Ich habe es geschaft!!!!! :smiley:

Beide LED-Panele laufen jetzt parallel über ein Arduino.

Vielen Dank an @paulpaulson und @nosaica!

Ich komme dank eurer Hilfe meinem Herzesprojekt einen Schritt näher.

Im Anschluss der Code.
Ich habe versucht ihn so gut wie möglich zu schreiben. Verbesserungsvorschläge gerne wilkommen.

/* ====================================================================================== */
/* Adafruit NeoPixel LED-LED_PANEL1s ========================================================= */
/* ====================================================================================== */

/* LED-LED_PANEL1: from Adafruit */
#include <Adafruit_NeoPixel.h>
#define LED1_PIN    9        // Defines the number of the Data-PIN for LED-LED_PANEL1 1
#define LED2_PIN    8        // Defines the number of the Data-PIN for LED-LED_PANEL1 2
#define LED1_COUNT 64        // Defines the number of LEDs for LED-LED_PANEL1 1
#define LED2_COUNT 64        // Defines the number of LEDs for LED-LED_PANEL1 2
Adafruit_NeoPixel LED_PANEL1(LED1_COUNT, LED1_PIN, NEO_GRB + NEO_KHZ800);  // Defines the kind of LED-LED_PANEL1 that is beeing used
Adafruit_NeoPixel LED_PANEL2(LED2_COUNT, LED2_PIN, NEO_GRB + NEO_KHZ800);  // Defines the kind of LED-LED_PANEL1 that is beeing used


/* Zeitnehmung millis */
unsigned long LED1_timestore;  // Variable Speicher für Systemzeit. for LED-LED_PANEL 1
unsigned long LED2_timestore;  // Variable Speicher für Systemzeit. for LED-LED_PANEL 2
int LED1_Status = LOW;
int LED2_Status = LOW;




/* ====================================================== */
/* ======================== VOID ======================== */
/* ====================================================== */

void setup() {
  LED_PANEL1.begin();           // INITIALIZE NeoPixel LED_PANEL1 object (REQUIRED)
  LED_PANEL2.begin();           // INITIALIZE NeoPixel LED_PANEL1 object (REQUIRED)
  LED_PANEL1.show();            // Turn OFF all pixels ASAP
  LED_PANEL2.show();            // Turn OFF all pixels ASAP
  pinMode(LED1_PIN, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist. 
  pinMode(LED2_PIN, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
}

/* ====================================================== */
/* ======================== LOOP ======================== */
/* ====================================================== */

void loop() {

/* =============================== */
/* ========== INPUT LED ========== */
/* =============================== */

/*
 * UserInterface (UI) sends which case to start.
 * UI sends Start, Pause, Stop
 * Set Brightness on UI
 * Pause ON/OF . bool pause = false
*/


/* =============================== */
/* ======== HANDLING LED ========= */
/* =============================== */


  
  LED_PANEL1.setBrightness(3);                          // Set Bightness (255 = max)
  LED_PANEL2.setBrightness(3);                          // Set Bightness (255 = max)
  unsigned long b1 = LED_PANEL1.Color(0, 0, 255);        // Set Color Blue
  unsigned long b2 = LED_PANEL2.Color(0, 0, 255);        // Set Color Blue

  
/* =============================== */
/* ========= OUTPUT LED ========== */
/* =============================== */



/* OUTPUT - LED Program NSYS ================================================================ */
/* OUTPUT LED_PANEL1        ================================================================ */

#define str LED_PANEL1.fill(b1);
/* millis() */
  if (LED1_Status == LOW) {
    if (millis() - LED1_timestore > 1000 ) {
         LED_PANEL1.fill(b1);
         LED_PANEL1.show();
      LED1_timestore = millis();
      LED1_Status = HIGH;
    }
  } else {
    if (millis() - LED1_timestore > 500) {
         LED_PANEL1.clear();
         LED_PANEL1.show();
      LED1_Status = LOW;
    }
  }


/* OUTPUT - LED Program NSYS ================================================================ */
/* OUTPUT LED_PANEL2        ================================================================ */

#define str LED_PANEL2.fill(b2);
/* millis() */
  if (LED2_Status == LOW) {
    if (millis() - LED2_timestore > 500 ) {
         LED_PANEL2.fill(b2);
         LED_PANEL2.show();
      LED2_timestore = millis();
      LED2_Status = HIGH;
    }
  } else {
    if (millis() - LED2_timestore > 250) {
         LED_PANEL2.clear();
         LED_PANEL2.show();
      LED2_Status = LOW;
    }
  }

/* OUTPUT LED - Program NSYS - ENDE ================================================================ */






















/* ENDE millis() */


  /*
  LED_PANEL1.fill(b);
  LED_PANEL1.show();
  delay(500);
 
  LED_PANEL1.clear();
  LED_PANEL1.show();
  delay(500);

  LED_PANEL1.fill(g);
  LED_PANEL1.show();
  delay(700);

  LED_PANEL1.clear();
  LED_PANEL1.show();
  delay(500);

  LED_PANEL1.fill(r);
  LED_PANEL1.show();
  delay(200);
  
  LED_PANEL1.clear();
  LED_PANEL1.show();
  delay(1000);
  */

}