Arduino Nano // gelöst

Hallo zusammen,

ich habe mir bei Amazon drei Nanos von Izokee gekauft und bin nun am testen ob diese einwandfrei funktionieren, wie geht ihr da so vor?
Ich habe die Multitasterabfrage von jurs genommen um mit Tastern LED´s zu schalten, dabei habe ich festgestellt das jeweils 5 funktionieren, aber bei sechs geht nichts mehr!
Damit mein ich 5 Taster Schalten 5 LEDS. Mit jeweils 6 flackern die LEDS nur kurz auf
Kann das sein?

Genutzt habe ich:
für Taster 2, 3, 4, 5, 6
für LED 12, 13, A0, A1, A2

Gruß Joe

Joe-muc:
.....
Ich habe die Multitasterabfrage von jurs genommen um mit Tastern LED´s zu schalten, dabei habe ich festgestellt das jeweils 5 funktionieren, aber bei sechs geht nichts mehr!
Kann das sein?
.....

Was genau heißt "bei sechs geht nichts mehr" ?

Bei sechs Uhr, oder was genau meinst du ?

Und ja, es kann sein.

Sorry wen ich mich etwas unklar ausgedrückt habe, ist abgeändert!
Könntest du mir als Anfänger auch erklären warum das sein kan......!?

Joe-muc:
Sorry wen ich mich etwas unklar ausgedrückt habe, ist abgeändert!
Könntest du mir als Anfänger auch erklären warum das sein kan......!?

Es könnte sein, dass du keine Widerstände an den Leds dran hast und die Last für den Nano-Clone zu groß wird.
Der macht dann dicke Backen.

HotSystems ... Deine Geduld hätte ich gerne - wobei die Überlegung echt Potential hat!
(wobei auch ein Nano-NICHT-Klon dann wohl zu knabbern hätte)

postmaster-ino:
HotSystems ... Deine Geduld hätte ich gerne - wobei die Überlegung echt Potential hat!
(wobei auch ein Nano-NICHT-Klon dann wohl zu knabbern hätte)

Naja, man möchte doch den "Unwissenden" :wink: helfen.
Ja, auch der Originale kann da schnell Probleme bekommen.

Also ich habe die Taster und LEDS wie im Arduino Starter Set angeschlossen
Taster mit 10kOhm
LEDS mit 220Ohm

bitte gib uns Deinen Sketch (den mit 5 und den mit 6 Tastern)
Grüße Uwe

Joe-muc:
Also ich habe die Taster und LEDS wie im Arduino Starter Set angeschlossen
Taster mit 10kOhm
LEDS mit 220Ohm

Starterset sagt mir nichts.
Kannst du bitte ein Schaltbild posten.

Musste an den PC wechseln, mit dem iPad kann ich keinen Code Posten.

Habe das Programm als zip angehängt da ich es in mehreren Taps geschrieben habe.

Arduino_Test.zip (2.66 KB)

Joe-muc:
Musste an den PC wechseln, mit dem iPad kann ich keinen Code Posten.

Habe das Programm als zip angehängt da ich es in mehreren Taps geschrieben habe.

Schon schlecht....kann ich mobil nicht lesen.

Also bitte Code-Tags verwenden.

Edit:
Gibt es den Sketch hier noch im Forum direkt ?

Also anbei mal das Programm:

Arduino Test

#define INPUTMODE INPUT  // INPUT oder INPUT_PULLUP
#define PRELLZEIT 5             // Prellzeit in Millisekunden
#define SHORTCLICKTIME 250      // Längste Zeit für einen SHORTCLICK
#define DOUBLECLICKTIME 400     // Längste Zeit für den zweiten Klick beim DOUBLECLICK
#define DimTIME 600       // Mindestzeit für einen LONGGLICK

byte buttonPins[]={2,3,4,5,6,7,8,9,10}; // Arduino Pins (mehrere als Array möglich)
#define NUMBUTTONS sizeof(buttonPins)
byte buttonState[NUMBUTTONS];  // Aktueller Status des Buttons HIGH/LOW

enum {NONE, FIRSTDOWN, FIRSTUP, SHORTCLICK, DOUBLECLICK, Dim, OUT};
byte buttonResult[NUMBUTTONS]; // Aktueller Klickstatus der Buttons NONE/SHORTCLICK/Dim

byte ledPins[]={11,12,13,A0,A1,A2,A4}; // Arduino Pins (mehrere als Array möglich)
#define NUMLEDS sizeof(ledPins)
byte ledState[NUMLEDS];





void setup() {
  
  Serial.begin(9600);
  Serial.println("Button test");
  for (int i=0;i<NUMBUTTONS;i++) pinMode(buttonPins[i],INPUTMODE);
  for (int j=0;j<NUMLEDS;j++)    pinMode(ledPins[j],OUTPUT);
  
  
}




void loop() {
  if (eingabe())
  {  
    SeriellerMonitor();
    ausgabe();
  }
  benchmark();
}

Tap LED´s schalten

//  Ausgabe hier LED´s schalten


void ausgabe()
// Klickstatus von geklickten Buttons mit Zeitstempel ausgeben
{
  for (int j=0;j<NUMLEDS;j++)
  for (int i=0;i<NUMBUTTONS;i++) 
    {
    if(buttonResult[i]==DOUBLECLICK) ledState[j]=LOW;
    if(buttonResult[0]==SHORTCLICK)
    ledState[0] = !ledState[0];
    if(buttonResult[1]==SHORTCLICK)
    ledState[1] = !ledState[1];
    if(buttonResult[2]==SHORTCLICK)
    ledState[2] = !ledState[2];
    if(buttonResult[3]==SHORTCLICK)
    ledState[3] = !ledState[3];
    if(buttonResult[4]==SHORTCLICK)
    ledState[4] = !ledState[4];
    if(buttonResult[5]==SHORTCLICK)
    ledState[5] = !ledState[5];
    if(buttonResult[6]==SHORTCLICK)
    ledState[6] = !ledState[6];
    if(buttonResult[7]==SHORTCLICK)
    ledState[7] = !ledState[7];
    if(buttonResult[8]==SHORTCLICK)
    ledState[8] = !ledState[8];
    digitalWrite(ledPins[0],ledState[0]); 
    digitalWrite(ledPins[1],ledState[1]); 
    digitalWrite(ledPins[2],ledState[2]);
    digitalWrite(ledPins[3],ledState[3]); 
    digitalWrite(ledPins[4],ledState[4]); 
    digitalWrite(ledPins[5],ledState[5]); 
    digitalWrite(ledPins[6],ledState[6]); 
    digitalWrite(ledPins[7],ledState[7]); 
    digitalWrite(ledPins[8],ledState[8]);  
    }
}

Tap Serieller Monitor

//  Serieller Monitor


void SeriellerMonitor()
// Klickstatus von geklickten Buttons mit Zeitstempel ausgeben
{
  for (int i=0;i<NUMBUTTONS;i++)
  {
    if (buttonResult[i]>=SHORTCLICK) // Ein Button wurde geklickt
    {
      Serial.print(millis()/1000.0,3); // Zeitstempel mit Millisekundenauflösung
      Serial.print("\tPin-");Serial.print(buttonPins[i]);
      
      //if (buttonResult[i]==FIRSTDOWN) Serial.println(" gedrückt");
      //else if (buttonResult[i]==FIRSTUP) Serial.println(" losgelassen");
      if (buttonResult[i]==SHORTCLICK) Serial.print(" CLICK");
      else if(buttonResult[i]==DOUBLECLICK) Serial.print(" DOUBLE CLICK");
      else if(buttonResult[i]==Dim) Serial.print(" Dimmen");
      //Serial.print("\tledState-");Serial.print(ledState[i]);
      Serial.print(" ledState-");Serial.println(ledState[i]);
          
    }
  }
}


void benchmark() {
  static unsigned long counterStartTime;
  static unsigned long counter;
  counter++;
  if (counter>=1000000L)
  {
    Serial.print("Average Time per loop(): ");
    Serial.print((micros()-counterStartTime)/1000000.0);
    Serial.println(" microseconds");
    counter=0;
    counterStartTime=micros();
  }
}

Tap Taster Abfrage

//  Taser Abfrage
//  Click
//  Longclick
//  Doppelclick


boolean eingabe()
// Rückgabewert false ==> Prellzeit läuft, Taster wurden nicht abgefragt
// Rückgabewert true ==> Taster wurden abgefragt und Status gesetzt
{
  static unsigned long lastRunTime;
  static unsigned long buttonDownTime[NUMBUTTONS];
  unsigned long now=millis();
  if (now-lastRunTime<PRELLZEIT) return false; // Prellzeit läuft noch
  lastRunTime=now;
  for (int i=0;i<NUMBUTTONS;i++)
  {
    byte curState=digitalRead(buttonPins[i]);    
    if (INPUTMODE==INPUT_PULLUP) curState=!curState; // Vertauschte Logik bei INPPUT_PULLUP
    if (buttonResult[i]>=SHORTCLICK) buttonResult[i]=NONE; // Letztes buttonResult löschen
    if (curState!=buttonState[i]) // Flankenwechsel am Button festgestellt
    {
      if (curState)   // Taster wird gedrückt, Zeit merken
      {
        if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]<DOUBLECLICKTIME)
          buttonResult[i]=DOUBLECLICK;
            
        else
        {  
          buttonDownTime[i]=now;
          buttonResult[i]=FIRSTDOWN;
        }
      }
      else  // Taster wird losgelassen
      {
        if (buttonResult[i]==FIRSTDOWN) buttonResult[i]=FIRSTUP;
        //if (now-buttonDownTime[i]>=DimTIME) buttonResult[i]=Dim;
      }
    }
    else // kein Flankenwechsel, Up/Down Status ist unverändert
    {
      if (curState==HIGH && now-buttonDownTime[i]>=DimTIME)
        buttonResult[i]=Dim;
      
        
     else  // Taster wird losgelassen

      
      if (buttonResult[i]==FIRSTUP && now-buttonDownTime[i]>DOUBLECLICKTIME)
        buttonResult[i]=SHORTCLICK;
    }
    buttonState[i]=curState;
  } // for
  return true;
  
}

Hab noch etwas weiter rum probiert, wenn ich also im byte ledPins[]={11,12,13,A0,A1,A2,A4} A3 weglasse kann ich 7 LED´s mit 7 Tastern schalten, mit A3 nur noch 5. Es lassen sich aber alle 9 Taster abfragen, seh ich m Seriellen Monitor.
Sollte ich jeweils noch einen LED Pin mehr hinzufügen leuchten alle Led´s mit dem jeweiligen Taster gedrückt nur kurz auf und gehen gleich wieder aus!
Im Seriellen Monitor sehe ich das sich bei allen 9 Tastern der ledState nicht mehr ändert, bleibt immer bei 0.

Joe-muc:
Hab noch etwas weiter rum probiert, wenn ich also im byte ledPins[]={11,12,13,A0,A1,A2,A4} A3 weglasse kann ich 7 LED´s mit 7 Tastern schalten, mit A3 nur noch 5. Es lassen sich aber alle 9 Taster abfragen, seh ich m Seriellen Monitor.
Sollte ich jeweils noch einen LED Pin mehr hinzufügen leuchten alle Led´s mit dem jeweiligen Taster gedrückt nur kurz auf und gehen gleich wieder aus!
Im Seriellen Monitor sehe ich das sich bei allen 9 Tastern der ledState nicht mehr ändert, bleibt immer bei 0.

Das sieht mir wie schon beschrieben, nach einer Überlastung des Atmega oder des Spannungsreglers aus.

Mit welcher Spannung betreibst du den Nano ?
Mach doch mal die Vorwiderstände größer, so ca. 390 Ohm, oder 2 x 220 Ohm in Reihe.

Also ich nutze ein Siemens Logo Power Supply mit 5V und 6,3A für den Nano über 5V in und die Taster und LEDs.
Diese Blinken bei 8 Definierten Ausgängen nur auf auch wenn ich z.B zwei 220 Ohm Wiederstände in Reihe schalte, ebenso wenn der Nano über USB mit Spannung versorgt wird, die Schaltung aber Extern(GNDs sind verbunden)
Wenn ich nur 7 Ausgänge definiere klappt es!

Ok, da habe ich so keine Erklärung mehr.

Teste hier mal eine andere Nummerierung:

Anstatt

byte ledPins[]={11,12,13,A0,A1,A2,A4};

nimm mal:

byte ledPins[]={11,12,13,14,15,16,17};

Teste hier mal eine andere Nummerierung:

Spielt hier keine Rolex.

Heißt du weißt woran es liegt combine?

Heißt du weißt woran es liegt combine?

Du meinst mich?

Nein!
Habe mir mal die *.zip angesehen....

Gefällt mir überhaupt nicht, das Programm!
Aus mehreren Gründen.
Darum wollte ich auch erst nichts dazu sagen.....

Beispiel:

   digitalWrite(ledPins[0],ledState[0]); 

digitalWrite(ledPins[1],ledState[1]);
    digitalWrite(ledPins[2],ledState[2]);
    digitalWrite(ledPins[3],ledState[3]);
    digitalWrite(ledPins[4],ledState[4]);

Dieser Block macht mich kirrre!

Bei jedem ausgabe() Aufruf wird der Block NUMLEDS*NUMBUTTONS mal durchlaufen.
Bei NUMLEDS==5 NUMBUTTONS==5 also 25 mal
Bei NUMLEDS==7 NUMBUTTONS==7 also 49 mal
Der Sinn dessen will sich mir nicht erschließen.

combie:
Du meinst mich?

Gefällt mir überhaupt nicht, das Programm!
Aus mehreren Gründen.
Darum wollte ich auch erst nichts dazu sagen.....

Beispiel:Dieser Block macht mich kirrre!

Bei jedem ausgabe() Aufruf wird der Block NUMLEDS*NUMBUTTONS mal durchlaufen.
Bei NUMLEDS==5 NUMBUTTONS==5 also 25 mal
Bei NUMLEDS==7 NUMBUTTONS==7 also 49 mal
Der Sinn dessen will sich mir nicht erschließen.

Für mich war das der „Weg“ wie ich einem bestimmten Taster eine zu schaltende LED zuordnen könnten!
Da ich wirklich nur ein Anfänger in der Arduino Welt bin würde ich mich sehr über eine detailliertere Antwort freuen, möchte ja schließlich was dabei lernen.
Besten Dank Joe

Nein, ich werden den Code nicht reparieren!

Aber du solltest die (sinnfrei) geschachtelten Schleifen auflösen.

Für mich war das der „Weg" wie ich einem bestimmten Taster eine zu schaltende LED zuordnen könnten!

Ein Irrweg.
(wie ich zu meinen, mir erlaube)

Mein Vorschlag:
Lerne langsam!
Ohne Code aus dem Netz zu fischen, und zu nutzen, welchen du nicht verstehst.
Erarbeite dir langsam eine eigene Lösung.