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);