Nou de code komt van 2 verschillende websites. Die 2 moeten in elkaar verweven worden.
De eerste zorgt netjes voor de getallen 01234567890, zoals in long number is gedefinieerd.
//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
//Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;
//7SegLED number of Segments
const int ledArray = 16;
byte byteData[ledArray] = {0};
char strData[ledArray] = {0};
//ledArray
//-9999999 to 99999999
long number = 01234567890
void setup() {
//Arduino pins to output because they are addressed in the main loop
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
sprintf(strData, "%ld", number);
//char byte
setDataFormat(strData, byteData);
digitalWrite(latchPin, LOW);
for(int i=ledArray-1; i>=0; i--){
shiftOut(dataPin, clockPin, MSBFIRST, byteData[i]);
}
digitalWrite(latchPin, HIGH);
}
void setDataFormat(char* strData,byte *byteData){
int numofNull=0;
// char byte
for(int i=0; i<ledArray; i++){
switch(strData[i]){
case '\0':
byteData[i]=0xff;
numofNull++;
break;
case '0':
byteData[i]=0xc0;
break;
case '1':
byteData[i]=0xf9;
break;
case '2':
byteData[i]=0xa4;
break;
case '3':
byteData[i]=0xb0;
break;
case '4':
byteData[i]=0x99;
break;
case '5':
byteData[i]=0x92;
break;
case '6':
byteData[i]=0x82;
break;
case '7':
byteData[i]=0xf8;
break;
case '8':
byteData[i]=0x80;
break;
case '9':
byteData[i]=0x90;
break;
case '-':
byteData[i]=0xbf;
break;
}
}
// char byte
for(int i=0; i<numofNull; i++){
byte tmp[ledArray];
int j;
for(int i =0; i<ledArray; i++){
tmp[i]=byteData[i];
}
for(int i =0; i<ledArray; i++){
if(i==0){
j = ledArray-1;
}else{
j = i-1;
}
byteData[i] = tmp[j];
}
}
}
Nummer 2 is een random waarbij het mij niet uitmaakt of het Bubble of Fisher is. Doel is dat 0123456789 steeds gemixed worden en die long number na een druk op een knop steeds veranderd.
Druk op de knop zet ik er nog wel in, dat is niet zo moeilijk. Mag nu in een loop zelfs met een pauze
// Arduino comparative shuffle test
// Fisher-yates vs "bubble unsort"
// 2010.03.13 raron
int anArray[] = {0,1,2,3,4,5,6,7,8,9};
int elements = sizeof(anArray) / sizeof(int);
void setup()
{
Serial.begin(9600);
delay(2000);
int noise = analogRead(2);
randomSeed(noise);
// Fisher-yates
shuffle(anArray, elements, sizeof(int));
Serial.println("---- fisher-yates shuffled ---- ");
printArray(anArray, elements);
}
void loop()
{
}
void printArray(int *array, int elem)
{
for (int p=0; p<elem; p++)
{
Serial.print("array[ ");
Serial.print(p); Serial.print(" ] = ");
Serial.println(array[p]);
}
}
// shuffle an array using fisher-yates method, O(n)
void shuffle(int *array, int nmemb, int size)
{
int r;
while (nmemb > 1) {
r = rand_range(nmemb--);
shuffle_swap(nmemb, r, array, size);
}
}
//----End Code---
De random is dus een array die ik op de plaats van long number wil hebben. Een getal mag niet dubbel in de rij voorkomen.
In C# op de PC werkt alles zoals ik wil en die taal snap ik ook met grafische weergave op het scherm.
Nu op Arduino met de DFRobot 8 LED-Segment SPI gebaseerd op de shift 75HCT595 wil me maar niet lukken.
Dit is een onderdeel van een geheel project, waarvan de rest wel werkt.
Alle ideeën welkom en tips en advies ook.