Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.




Arduino scorebord N...
 
Deel:
Meldingen
Alles wissen

Arduino scorebord Neopixel, onbegrijpelijk stukje code.

87 Berichten
2 Gebruikers
0 Likes
1,145 Bekeken
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Beste wensen iedereen! Even ter info : als iemand uit kan leggen hoe ik regelnummers toe kan voegen aan de code, dan pas ik dit meteen aan. Maakt het denk ik veel overzichtelijker.

Ik ben bezig met het aanpassen van een code voor een basketbal scorebord voor mijn buurjongen zijn team. Ik heb de originele maker reeds vragen gesteld, maar daar krijg ik helaas geen antwoord op. Ik ben niet op zoek naar de kant en klare oplossing, maar zou graag de goede richting in willen om zelf te leren wat ik aan moet passen (anders leer ik nog niks).

Het origineel is gebaseerd op een Arduino nano, vandaar dat er voor deze code gekozen werd. Ik zou het graag aanpassen naar een meer "moderne" manier, maar dat gaat helaas nu nog mijn pet teboven...

Ik wil alle nummers maken van 7 segmenten (4leds x 7 = 28leds per nummer).

De code is al op een aantal plaatsen aangepast, maar hij klopt nog van geen kanten (veel fouten nu). Laten we zeggen dat ik het 1 voor 1 wil aanpassen, zo denk ik dat ik het allemaal wat beter leer. Ik heb de cursus van Hans de laatste maand doorgenomen, maar er zit een stukje code in wat ik niet thuis kan brengen helaas.

Bedoeling is :

- een timer in minuten en seconden

- punten per team tot 199

- periode van 0 tot 4

- fouten per team van 0 tot 5

- alleen timer wordt rood als er minden dan 1 minuut overblijft

- alles aangestuurd via bluetooth

 

Waar ik nu mee zit, is dat de timer inderdaad rood wordt onder de minuut (de rest blijft groen), maar zodra ik dan punten verhoog, wordt dit ook rood, alsook de periode. Voor zover ik het begrijp, gaat het over dit stukje, en dan voornamelijk het deel "for(int enz.)". Dat is ook meteen het stukje wat ik niet thuis kan brengen :

 void showSegment(char a, int i){
  i = i-1;// arrays start with zero
  int n = a-'A';
  for(int j =  seg[(i*7)+n][0]-1; j<seg[(i*7)+n][1]; j++){
    if(secColorRed==true){
      strip.setPixelColor(j, strip.Color(255,0,0));
    }else{
      strip.setPixelColor(j, strip.Color(r,g,b));

 

 Dat stukje heeft volgens mij te maken met, onder andere :

void loop() {
  if(timerStatus){
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      // save the last time you blinked the LED
      count++;
      if(count%2==0){
        tick();  
      }else{
        tock();  
      }
      previousMillis = currentMillis;
      timerSec = timerSec-1;
      if(timerSec<0){
        timerSec=59;
        timerMin = timerMin-1;
        if(timerMin<0){
          timerMin=0;
          timerSec=0;
          timerStatus=false;
          Serial.println("TIME UP");
          soundAlarm();
        }
        if(timerMin<1){
          secColorRed=true;  
        }else{
          secColorRed=false;
        }
        showScore(timerMin,2);
      }
      showScore(timerSec,3);

 

Kan iemand mij in de richting sturen wat het 1 met  het ander te maken heeft, zodat ik dat kan aanpassen? De complete code is hieronder (krijg de regelnummers niet zichtbaar hier helaas). Let aub niet op de overige (vele) fouten. Daar ben ik me van bewust, maar zoals gezegd, 1 voor 1. Om een idee te geven : ik zit hier toch al een maand of 2 mee te "frotten" en het verveeld nog steeds niet 😉 .

#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

SoftwareSerial BT(0, 1); //TX,RX of the Bluetooth Module
#define LED_PIN    7
#define LED_COUNT 270
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

#define NumOfDigits 11
const int seg[(7*NumOfDigits)][4] ={
  {0}, //A1 100 links score
  {1,4}, //B
  {5,8}, //C
  {0}, //D
  {0}, //E
  {0}, //F
  {0}, //G
  {17,20}, //A2 10 links score
  {21,24}, //B
  {25,28}, //C
  {29,32}, //D
  {9,12}, //E
  {13,16}, //F
  {33,36}, //G
{45,48}, //A3 1 links score
{49,52}, //B
{53,56}, //C
{57,60}, //D
{37,40}, //E
{41,44}, //F
{61,64}, //G
{73,76}, //A4 10 minuten
{77,80}, //B
{81,84}, //C
{85,88}, //D
{65,68}, //E
{69,72}, //F
{89,92}, //G
{101,104}, //A5 1 minuut
{105,108}, //B
{109,112}, //C
{113,116}, //D
{93,96}, //E 
{97,100}, //F
{117,120}, //G
{131,134}, //A6 10 seconden
{135,138}, //B
{139,142}, //C
{143,146}, //D
{123,126}, //E 2 opgeschoven voor dots
{127,130}, //F
{147,150}, //G
{159,162}, //A7 1 seconde
{163,166}, //B
{167,170}, //C
{171,174}, //D
{151,154}, //E
{155,158}, //F
{175,178}, //G
{0}, //A8 100 rechts score
{179,182}, //B
{183,186}, //C
{0}, //D
{0}, //E
{0}, //F
{0}, //G
{195,198}, //A9 10 rechts score
{199,202}, //B
{203,206}, //C
{207,210}, //D
{187,190}, //E
{191,194}, //F
{211,214}, //G
{223,226}, //A10 1 rechts score
{227,230}, //B
{231,234}, //C
{235,238}, //D
{215,218}, //E
{219,222}, //F
{239,242}, //G
{251,254}, //A11 periode
{255,258}, //B
{259,262}, //C
{263,266}, //D
{243,246}, //E
{247,250}, //F
{267,270}, //G
};


String inputString = "";
bool stringComplete = false;

bool timerStatus = false;
int scoreLeft = 0;
int scoreRight= 0;
int timerMin  = 0;
int timerSec  = 0;
int Period = 0;

byte r=0, g=255, b=0;
bool secColorRed=false;

unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1000;           // interval at which to blink (milliseconds)
unsigned long count = 0;           // interval at which to blink (milliseconds)

const int buzzer=8;

void setup() {
  Serial.begin(9600);
  BT.begin(9600);

  BT.println("Connected to Arduino");
  
  delay(1000);

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

  pinMode(buzzer, OUTPUT);

//  while(1){
//    strip.setPixelColor(120, strip.Color(r,g,b));
//    strip.setPixelColor(121, strip.Color(r,g,b));
//    strip.show();
//    delay(500);
//    strip.setPixelColor(120, strip.Color(0,0,0));
//    strip.setPixelColor(121, strip.Color(0,0,0));
//    strip.show();
//    delay(500);
//  }

//  while(1){
//    strip.clear();
//    for(int y=7; y<9; y++){
//      for(char z = 'A'; z<'H'; z++){
//        showSegment(z,y);
//        strip.show();
//        delay(1000);  
//      }
//    }
//  }
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
    inputString.reserve(10);
  delay(1000);
  strip.clear();
  strip.show();
  showScore(0,1);
  delay(250);
  showScore(0,2);
  delay(250);
  showScore(0,3);
  delay(250);
  showScore(0,4);
  delay(250);
  showScore(0,5);
  delay(250);
}

void loop() {
  if(timerStatus){
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      // save the last time you blinked the LED
      count++;
      if(count%2==0){
        tick();  
      }else{
        tock();  
      }
      previousMillis = currentMillis;
      timerSec = timerSec-1;
      if(timerSec<0){
        timerSec=59;
        timerMin = timerMin-1;
        if(timerMin<0){
          timerMin=0;
          timerSec=0;
          timerStatus=false;
          Serial.println("TIME UP");
          soundAlarm();
        }
        if(timerMin<1){
          secColorRed=true;  
        }else{
          secColorRed=false;
        }
        showScore(timerMin,2);
      }
      showScore(timerSec,3);
    }        
  }

  
  if (stringComplete) {
    Serial.println(inputString);
    if(inputString.length()!=4){
      Serial.print(F("Len="));
      Serial.println(inputString.length());
      inputString = "";
      stringComplete = false;
    }
    char cmd = inputString[0];
    char param = inputString[1]-'0';
    inputString = "";
    stringComplete = false;
    switch(cmd){      
      case 'L':
        scoreLeft = scoreLeft+param;
        Serial.print(F("LEFT="));
        Serial.println(scoreLeft );
        showScore(scoreLeft,1);
        break; 
      case 'l':
        scoreLeft = scoreLeft-param;
        Serial.print(F("LEFT="));
        Serial.println(scoreLeft );
        showScore(scoreLeft,1);
        break;
      case 'M':
        timerMin = timerMin+param;
        Serial.print(F("timerMin="));
        Serial.println(timerMin);
        showScore(timerMin,2);
        break; 
      case 'm':
        timerMin= timerMin-param;
        Serial.print(F("timerMin="));
        Serial.println(timerMin);
        showScore(timerMin,2);
        break;
      case 'S':
        timerSec = timerSec+param;
        Serial.print(F("timerSec="));
        Serial.println(timerSec);
        showScore(timerSec,3);
        break; 
      case 's':
        timerSec= timerSec-param;
        Serial.print(F("timerSec="));
        Serial.println(timerSec);
        showScore(timerSec,3);
        break;
      case 'R':
        scoreRight= scoreRight+param;
        Serial.print(F("RIGHT="));
        Serial.println(scoreRight);
        showScore(scoreRight,4);
        break; 
      case 'r':
        scoreRight= scoreRight-param;
        Serial.print(F("RIGHT="));
        Serial.println(scoreRight);
        showScore(scoreRight,4);
        break;
      case 'P':
        Period = Period+param;
        Serial.print(F("PERIOD="));
        Serial.println(Period );
        showScore(Period,5);
        break;
      case 'p':
        Period = Period-param;
        Serial.print(F("PERIOD="));
        Serial.println(Period );
        showScore(Period,5);
        break;
      case 'T':
        timerStatus = !timerStatus;
        if(timerStatus==false){
          previousMillis = 0;
        }
        Serial.print(F("TIMER="));
        Serial.println(timerStatus);
        break;
      case 'X':
        r = 255;
        g = 0;
        b = 0;
        break;
      case 'Y':
        r = 0;
        g = 255;
        b = 0;
        break;
      case 'Z':
        r = 0;
        g = 0;
        b = 255;
        break;
      default:
        Serial.println(F("COMMAND"));
        break;
    }    
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
    if(inputString.length()>8){
      inputString = "";    
    }
  }
}

void colorWipe(void) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, strip.Color(random(0,255),random(0,255),random(0,255)));         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(1);                           //  Pause for a moment
  }
}


void showScore(int n, int i){
  n = constrain(n,0,999);
  switch(i){
    case 1:
      if(n>9){
        showDigit(n/10,2);
      if(n>9 && n>99){
        showDigit(n/10,3);
        showDigit(n/10,2);
      }
      }else{
        showDigit(-1,2);
      }
      showDigit(n%10,3);
      break;
    case 2:
      if(n>9){
        showDigit(n/10,4);
      }else{
        showDigit(-1,4);
      }
      showDigit(n%10,5);
      break;
    case 3:
      if(n>9){
        showDigit(n/10,6);
      }else{
        showDigit(-1,6);
      }
      showDigit(n%10,7);
      break;
    case 4:
      if(n>9){
        showDigit(n/10,9);
      }else{
        showDigit(-1,9);
      }
      showDigit(n%10,10);
      break;
    case 5:
      if(n>4){
        showDigit(n/10,11);
      }else{
        showDigit(-1,11);
      }
      showDigit(n%5,11);
      break;
  }  
  strip.show();
}


void clearDigit(int n){
  n = n-1;// arrays start with zero
  for(int i=0; i<7; i++){
    for(int j =  seg[(n*7)+i][0]-1; j<seg[(n*7)+i][1]; j++){
      strip.setPixelColor(j, strip.Color(0,   0,   0));
    }
  }
}

//0=A,B,C,D,E,F
//1=B,C
//2=A,B,D,E,G
//3=A,B,C,D,G
//4=B,C,F,G
//5=A,C,D,F,G
//6=A,C,D,E,F,G
//7=A,B,C
//8=A,B,C,D,E,F,G
//9=A,B,C,D,F,G
// int n = number to show, int i = digit to show on
void showDigit(int n, int i){
  clearDigit(i);
  switch(n){
    case -1:
        clearDigit(i);
        break;
    case 0:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('E',i);
      showSegment('F',i);
      break;
    case 1:
      showSegment('B',i);
      showSegment('C',i);
      break;
    case 2:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('D',i);
      showSegment('E',i);
      showSegment('G',i);
      break;
    case 3:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('G',i);
      break;
    case 4:
      showSegment('B',i);
      showSegment('C',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
    case 5:
      showSegment('A',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
    case 6:
      showSegment('A',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('E',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
    case 7:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('C',i);
      break;
    case 8:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('E',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
    case 9:
      showSegment('A',i);
      showSegment('B',i);
      showSegment('C',i);
      showSegment('D',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
      default:
      showSegment('A',i);
      showSegment('D',i);
      showSegment('E',i);
      showSegment('F',i);
      showSegment('G',i);
      break;
  }
}

void showSegment(char a, int i){
  i = i-1;// arrays start with zero
  int n = a-'A';
  for(int j =  seg[(i*7)+n][0]-1; j<seg[(i*7)+n][1]; j++){
    if(secColorRed==true){
      strip.setPixelColor(j, strip.Color(255,0,0));
    }else{
      strip.setPixelColor(j, strip.Color(r,g,b));
    }
  }
}

void tick(){
    strip.setPixelColor(120, strip.Color(r,g,b));
    strip.setPixelColor(121, strip.Color(r,g,b));
    strip.show();  
}
void tock(){
    strip.setPixelColor(120, strip.Color(0,0,0));
    strip.setPixelColor(121, strip.Color(0,0,0));
    strip.show();  
}

void soundAlarm(void){
  digitalWrite(buzzer, HIGH); 
  delay(1500);
  digitalWrite(buzzer, LOW);  
}

//
//  for(int y=1; y<5; y++){
//    for(int z = 0; z<5; z++){
//      showScore(z,y);
//      strip.show();
//      delay(100);  
//    }
//  }
//  strip.clear();
//  delay(2000);
//  for(int y=1; y<9; y++){
//    for(char z = 'A'; z<'H'; z++){
//      showSegment(z,y);
//      strip.show();
//      delay(50);  
//    }
//  }
//  strip.clear();
//  delay(2000);
//  for(int y=1; y<9; y++){
//    for(int z = 0; z<10; z++){
//      showDigit(z,y);
//      strip.show();
//      delay(100);  
//    }
//  }
//  strip.clear();
//  delay(2000);

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

Hi Fredrossi - sorry voor de erg late reactie, en ook voor jou de beste wensen 😊 

Regelnummers toevoegen doet het forum helaas (nog) niet, iets wat ik wel nog wil toevoegen in de nabije toekomst.

Als ik kijk naar de code voorbeelden en de weg die je wilt bewandelen, dan zou ik geneigd zijn om vanaf nul helemaal opnieuw te beginnen. Maar dat is misschien even iets te veel gevraagd als beginner.

Even kijkende naar wat je nu hebt: de function "showSegment" kijkt naar de globale "secColorRed". Zodra die op true staat, wordt elk segment rood weergegeven. Zonder al te diep in de code te duiken (ik kan de code niet testen door gebrek aan hardware), en met beperkt zicht op hoe het score bord er uit ziet, lijkt het me dat je achter dat stukje wat je aanhaalde even setColorRed weer op False moet zetten.

Dus zoiets:

void loop() {
  if(timerStatus){
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      // save the last time you blinked the LED
      count++;
      if(count%2==0){
        tick();  
      }else{
        tock();  
      }
      previousMillis = currentMillis;
      timerSec = timerSec-1;
      if(timerSec<0){
        timerSec=59;
        timerMin = timerMin-1;
        if(timerMin<0){
          timerMin=0;
          timerSec=0;
          timerStatus=false;
          Serial.println("TIME UP");
          soundAlarm();
        }
        if(timerMin<1){
          secColorRed=true;  
        }else{
          secColorRed=false;
        }
        showScore(timerMin,2);
      }
      showScore(timerSec,3);
    }        
  }

secColorRed=false;  // <-- toevoegen

 

Immers elke keer na minuten en seconden weergeven, moet alles groen zijn.
In de loop wordt steeds weer opnieuw bepaald of de speeltijd < 1 minuut is, waardoor de tijd op rood gaat als dat het geval is.

Probeer het eens - ben benieuwd 😊 


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Ik ben inderdaad ook van plan geweest om het helemaal opnieuw zelf te doen. Zoals je zegt is dat voor mij nog niet te doen. Ter verduidelijking : ik ga mezelf nu verdiepen in C++ (boeken e.d. aangeschaft, hele nieuwe wereld....).

De aanpassing zoals je uitlegt geeft een verbetering en klinkt ook zeer logisch inderdaad. Wat hij nu doet:

Zodra de minuut onder de 1 komt, wordt deze rood. Ook de seconden worden 1x rood, om vervolgens weer groen te blijven tot aan 0. Dan wordt alles rood. De periode en score blijven wel groen! Super, maar hoe komt het dat de seconden toch weer groen worden tijdens aftellen, om op het eind toch weer rood te eindigen? Mooie is nu wel, dat als ik tijdens aftellen er een minuut bijzet, deze weer groen wordt, dat werkte eerst ook niet.

P.s. ik ben niet uit noodzaak aan de slag met C++, meer omdat het mij enorm interesseert hoe 1 en ander werkt. Gaat nog wel wat jaren duren ben ik bang.....


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

De code is helaas een beetje rommelig omdat enkele functies voor alle digits worden gebruikt.

Dit maakt het gebruik van een globale variabele (SetColorRed) ook een probleem.
Overigens ... een globale variable is technisch gezien natuurlijk niet verkeerd, maar vaak is het minder handig, zo ook hier. Je ziet nu dat deze globale variable ergens in de code wordt veranderd en dat dit dan een ongewenst effect geeft - maar we weten niet precies waar dit veroorzaakt wordt. 

Dat komt dus door de globale variable, maar ook omdat we functie een beetje te generiek gebruiken.

Ik zou zelf een functie maken voor tijd, score, etc weergave.
Je kunt dan in de code duidelijker zien wat er gebeurt.

Of de functies zo maken dat ze een extra parameter krijgen, b.v. de kleur die je wilt zien, of het feit dat het wel of niet rood of groen moet zijn (met een boolean).

Mocht je de moed er voor hebben, dan wil ik best met je meekijken met een verse start ...
Het lijkt best wat werk, maar misschien zorgt het er wel voor dat het eind product beter wordt. 😊 

Merk op: FastLED is vlotter, stabieler en meer volwassen dan NeoPixel - dus iets om in het hoofd te houden voor de toekomst.


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Ik denk ook dat een verse start beter gaat zijn. Mocht het om iets "simpels" gaan, dan had ik dat best zelf willen proberen (met behulp van internet). Wat ik hier wil bereiken, gaat inderdaad wel heel erg ver boven mijn hoofd (vandaar de knoop doorgehakt met C++).

Ik heb bewust voor Neopixel gekozen, omdat ik daar lang geleden ook eens mee gewerkt heb (raspberry pi pixelstick). Nog een reden dus om vers te beginnen en met FastLED aan de slag te gaan.

Ik heb er de moed wel voor, maar dat zou bijna een 1 op 1 cursus worden, en ik denk dat jij daar ook niet heel vrolijk van wordt 😮 . Maar ik neem de uitdaging anders wel graag aan!!

Zoals gezegd, de maker van het origineel heeft alles geschreven voor een Nano ivm geheugen. Ik zou persoonlijk kiezen voor een Arduino met meer power, zodat ik niet hoef te kijken naar inperkingen van de code.

Nogmaals, ik durf het wel aan, al zal het tijd kosten (een internationaal chauffeur heeft doordeweek niet veel tijd 😉  )


   
BeantwoordenCiteren


 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

Misschien kunnen we het een Tweaking4All project maken ... en dat je niet altijd tijd hebt komt dan eigenlijk best goed uit voor mij haha 😉  (m'n moeder is herstellende van chemo en bestraling, en wij zorgen voor haar - wat stiekem best wat tijd kost, maar het echt helemaal waard is).

Normaal gesproken, voor een project als dit, schrijf ik eerst de specificaties en wensen op, zodat we het geheel in kleine "problemen" kunnen opsplitsen.


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Herstellende klinkt goed!! 👍 

Ik zal e.e.a. verduidelijken wat ik graag zou zien, maar misschien is dat niet voor dit topic?


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

Prima om het hier door te spreken hoor - jouw onderwerp!
Laat eens een schets of foto zien van wat je in gedachten hebt. 😊 

(ik ben geen sport kenner - dus het is wat lastig voor te stellen)


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Bijgevoegd is een beetje wat de bedoeling is. Tekening heb ik gemaakt in Solidworks.

Er zitten wel een heel aantal voorwaarden aan, meer als het origineel. Dat maakt het aanpassen van de code dus ook een P.I.T.A. 😉 .

Moet wel gezegd, als je iets vanaf 0 maakt, heb je er natuurlijk wel meer voldoening van.... daar ligt mijn probleem dus.

Wat er allemaal in zou moeten verwerkt worden :

  • Timer van 99min : 59sec
  • 2 x score aanduiding van 0 tot 199
  • 2 x aantal fouten van 5 punten
  • 1 x periode van 1 tot 4
  • Aangestuurd via bluetooth (HC-06?)
  • Evt via homemade app
  • WS2812B LED’s adressable.
  • Mega 2560 board? (heb ik nu liggen vandaar)

 

Alles wordt gemaakt van zelfgebouwde 7 segment LED’s. 4 LED’s per segment ivm het draagbaar maken van het scorebord. Het wordt mobiel, zodat het mee kan naar uit-wedstrijden.                     Dus 28 per digit.

Voor het aantal fouten worden per fout 2 LED’s gebruikt, dus geen 7 segment display.

Voor de score aanduiding is voor het honderdtal geen 0, maar niets of 1.

Voor de timer geldt :

  • het getal 0 wordt steeds weergegeven, totdat de tijd voorbij is, dan wordt 4x0 getoond.
  • Onder de minuut wordt de timer rood (de rest blijft groen)
  • fouten worden steeds rood aangegeven
  • Als tijd voorbij is, klinkt een buzzer
  • Een dubbele punt tussen minuten en seconden (2 LED’s, mag groen blijven voor meer contrast)

 

Nogal een flink lijstje met wensen, maar onder het mom van : je maakt het maar 1 keer, dus dan maar goed 😎 

 

 


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Edit.... voor fouten, alsook voor de dubbele punt tussen de timer, wordt steeds een enkele LED gebruikt. Zo heb ik totaal 280 LED's nodig.


   
BeantwoordenCiteren


 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

Ik ga er morgen (of misschien vandaag nog) eens goed naar kijken ... leuk om zo'n project te beginnen! 😊 


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Net weer thuis, en onderweg in de truck is het toch lastig zoeken... 😉 . Ik zie verschillende manieren van coderen van WS2812B. De gebruikte in bovenstaande is zoals ik begrijp "home-made". Ik ben ook een site tegengekomen waar iemand zelf wat bedacht heeft :

https://werner.rothschopf.net/202005_arduino_neopixel_display_en.htm

Die heb ik al meerdere malen aangekeken, maar weet niet of we hier wat aan hebben. Je schrijft dat fastLED vlotter werkt dan Neopixel, heeft dat in deze opstelling eigenlijk wel voordelen?

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

Ik zit even te kijken naar de segment afbeelding (van de link die je net stuurde).

Ik zie dat het een aparte aanvulling voor Neopixel is - dus niet handig (tenzij we het ombouwen) voor een FastLED toepassing. Uiteraard staat het vrij deze aanvulling gecombineerd met NeoPixel te gebruiken.

De gebruikte bitwise opslag van een segment is natuurlijk wel erg efficient en elegant van uit een design perspectief.

Persoonlijk maak ik liever zelf een oplossing indien het niet te gek wordt. Ik zal dus niet proberen FastLED na te maken, maar LED aansturing vindt ik dan weer een leuke puzzle 😊 

Keuze van Arduino model zal niet veel uitmaken voor het schrijven van de code, en werken met wat we al hebben is natuurlijk het fijnste.

N.b. Als ik nog een Arduino zou moeten aanschaffen, zou ik een ESP32 nemen (zoals deze - ong. €7,50 per stuk als je ze per 3 koopt, of deze nog kleinere modellen die zelfs minder van €7/stuk kosten als je ze per 3 koopt).

Zeg maar wat je wilt ... zelf maken of die Library gebruiken. 😊 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 9 jaren geleden
Berichten: 2272
 

p.s. had je al een aansluit volgorde in gedachten voor het maken van een 7 segment LED?

Beste zou zijn: begin bij A (links), loop van A naar B, van B naar C, van C naar D, etc.
Dit maakt eventuele code ook gemakkelijker.

Vond toevallig dit lijstje ergens:


   
BeantwoordenCiteren
 Anoniem
Deelgenomen: 53 jaren geleden
Berichten: 0
Topic starter  

Ik was ook niet van plan het wiel opnieuw uit te vinden, maar in mijn zoektocht naar een oplossing destijds kwam ik die link tegen vandaar. Ik zou dan ook zeggen om het zelf te maken (al zal ik hier vooral de leerling gaan zijn...). Je link van de esp ziet er prima uit. Voordeel is dat deze kleiner is, en er zit bluetooth (en wifi) ingebouwd. Ik zou zeggen win-win. Ik lees ook vooral positieve dingen daarover icm WS2812B.

 

De aansluiting had ik in eerste instantie via E F A B C D G gedaan, maar als we toch opnieuw beginnen, lijkt me A B C het eenvoudigst. Vooral met alles aan elkaar solderen zal dit wat makkelijker worden.

Zal zo eens kijken of Amazon.nl ook de ESP op voorraad heeft, scheelt weer tijd 😉 .


   
BeantwoordenCiteren


Pagina 1 / 6

Bevalt je wat je hier ziet, en wil je graag helpen? 

Uiteraard is de beste manier van helpen, door anderen hier te helpen met hun vragen. Maar je kunt ons ook op andere manieren helpen:

- Shop bijvoorbeeld bij Amazon, het kost je niks extra, maar het kan zijn dat wij een kleine commissie ontvangen,
- stuur me een koffie via PayPal ($5, $10, $20, or zelf kiezen),
- je kunt ook een Patreon worden,
- of BitCoin (BTC), of BitCoinCash (BCH) doneren.

Deel: