Hallo Leute,
ich habe an meinem I2C Slave (Arduino Uno) 8 Drehencoder angeschlossen. Dieser sendet die Werte der Encoder an den Master - bzw. der Master fragt diese ab.
Die 8 Drehencoder steuern aber nicht jeweils nur einen Wert, sondern bekommen durch Menüabrufe andere Variablen zugewiesen die dann den Wert der Encoder annehmen.
Die eingestellten Werte Speicher ich.
Wird der Menüpunkt neu abgerufen und der Drehencoder befindet sich - sagen wir mal auf Position 40 - der Wert der Variable des Menüpunkte ist aber 12, so soll der Master dem Slave die aktuellen Werte schicken, damit bei 12 weitergeregelt wird und nicht bei 40.
Pro Menüpunkt bekommen alle Drehencoder eine neue Zuweisung.
Soweit klappt das eigentlich ganz gut. Nur nach teilweise 2, 3 Menüwechseln verspringen die Werte im Array dann plätzlich eine Position nach vorne.
Woran kann das liegen?
Slave:
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
#include <Wire.h>
Encoder myEnc0( 8, 9 );
Encoder myEnc1( 7, 10 );
Encoder myEnc2( 11, 6 );
Encoder myEnc3( 12, 5 );
Encoder myEnc4( 4, 13 );
Encoder myEnc5( 3, A0 );
Encoder myEnc6( 2, A1 );
Encoder myEnc7( A3, A2 );
long pos[] = {0, 0, 0, 0, 0, 0, 0, 0};
long newPos[] = {0, 0, 0, 0, 0, 0, 0, 0};
int encAnz = 8;
int bus_adr = 2; // i2C bus address
int var[] = {0,0,0,0,0,0,0,0};
void setup() {
Serial.begin(9600);
Serial.println("Basic NoInterrupts Test:");
Wire.begin(bus_adr); // join i2c bus
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent); // register event
}
void loop() {
for (int i=0; i < encAnz; i++){
if (newPos[i] != pos[i]) {
// Serial.print( i );
for (int j=0; j < encAnz; j++){
if( newPos[i] <= 0 ){
switch (i){
case 0: myEnc0.write(0); break;
case 1: myEnc1.write(0); break;
case 2: myEnc2.write(0); break;
case 3: myEnc3.write(0); break;
case 4: myEnc4.write(0); break;
case 5: myEnc5.write(0); break;
case 6: myEnc6.write(0); break;
case 7: myEnc7.write(0); break;
}
newPos[i] = 0;
pos[i] = 0;
}
Serial.print ("\t");
Serial.print ( newPos[j] );
}
Serial.println("");
newPos[0] = constrain(newPos[0],0,14);
newPos[1] = constrain(newPos[1],0,100);
newPos[2] = constrain(newPos[2],0,100);
newPos[3] = constrain(newPos[3],0,100);
newPos[4] = constrain(newPos[4],0,100);
newPos[5] = constrain(newPos[5],0,100);
newPos[6] = constrain(newPos[6],0,100);
newPos[7] = constrain(newPos[7],0,100);
myEnc0.write(newPos[0]);
myEnc1.write(newPos[1]);
myEnc2.write(newPos[2]);
myEnc3.write(newPos[3]);
myEnc4.write(newPos[4]);
myEnc5.write(newPos[5]);
myEnc6.write(newPos[6]);
myEnc7.write(newPos[7]);
pos[i] = newPos[i];
}
}
newPos[0] = myEnc0.read();
newPos[1] = myEnc1.read();
newPos[2] = myEnc2.read();
newPos[3] = myEnc3.read();
newPos[4] = myEnc4.read();
newPos[5] = myEnc5.read();
newPos[6] = myEnc6.read();
newPos[7] = myEnc7.read();
}
void receiveEvent(int howMany) {
for (int i=0; i<howMany; i++) {
var[i] = Wire.read();
newPos[i] = var[i];
Serial.print ("\t");
Serial.print ( newPos[i] );
}
myEnc0.write(var[1]);
myEnc1.write(var[2]);
myEnc2.write(var[3]);
myEnc3.write(var[4]);
myEnc4.write(var[5]);
myEnc5.write(var[6]);
myEnc6.write(var[7]);
myEnc7.write(var[8]);
}
void requestEvent(){
union {
int encoder [8];
byte buf [16];
} encValues;
encValues.encoder [0] = pos[0];
encValues.encoder [1] = pos[1];
encValues.encoder [2] = pos[2];
encValues.encoder [3] = pos[3];
encValues.encoder [4] = pos[4];
encValues.encoder [5] = pos[5];
encValues.encoder [6] = pos[6];
encValues.encoder [7] = pos[7];
Wire.write((byte *) &encValues, sizeof encValues);
}
Da der Mastercode viel zu riesig ist hier die Cod schnipsel um die es geht:
Globale Variablen
int var[8] = {0,0,0,0,0,0,0,0};
int var2[8] = {0,0,0,0,0,0,0,0};
int bus_adr = 2;
int dis2Men1Cam5, dis2Men1Cam6, dis2Men1Cam7, dis2Men1Cam8, dis2Men2Cam5, dis2Men2Cam6, dis2Men2Cam7, dis2Men2Cam8;
int dis2Men3Cam5, dis2Men3Cam6, dis2Men3Cam7, dis2Men3Cam8, dis2Men4Cam5, dis2Men4Cam6, dis2Men4Cam7, dis2Men4Cam8;
int dis2Men5Cam5, dis2Men5Cam6, dis2Men5Cam7, dis2Men5Cam8, dis2Men6Cam5, dis2Men6Cam6, dis2Men6Cam7, dis2Men6Cam8;
int dis2Men7Cam5, dis2Men7Cam6, dis2Men7Cam7, dis2Men7Cam8, dis2Men8Cam5, dis2Men8Cam6, dis2Men8Cam7, dis2Men8Cam8;
int dis2Men9Cam5, dis2Men9Cam6, dis2Men9Cam7, dis2Men9Cam8;
// Display 3
int dis3Men1Cam5, dis3Men1Cam6, dis3Men1Cam7, dis3Men1Cam8, dis3Men2Cam5, dis3Men2Cam6, dis3Men2Cam7, dis3Men2Cam8;
int dis3Men3Cam5, dis3Men3Cam6, dis3Men3Cam7, dis3Men3Cam8, dis3Men4Cam5, dis3Men4Cam6, dis3Men4Cam7, dis3Men4Cam8;
int dis3Men5Cam5, dis3Men5Cam6, dis3Men5Cam7, dis3Men5Cam8, dis3Men6Cam5, dis3Men6Cam6, dis3Men6Cam7, dis3Men6Cam8;
int dis3Men7Cam5, dis3Men7Cam6, dis3Men7Cam7, dis3Men7Cam8, dis3Men8Cam5, dis3Men8Cam6, dis3Men8Cam7, dis3Men8Cam8;
int dis3Men9Cam5, dis3Men9Cam6, dis3Men9Cam7, dis3Men9Cam8;
geht bis Display12 aber ist ja unrelevant
Hier hole ich die Werte vom Slave - Funktioniert einwandfrei
void getEncValues() {
union {
int encoder [8];
byte buf [16];
} encValues;
if (Wire.requestFrom( bus_adr, sizeof encValues) != sizeof encValues)
return; // oops!
for (byte i = 0; i < sizeof encValues; i++)
encValues.buf [i] = Wire.read ();
var[0] = encValues.encoder [0];
var[1] = encValues.encoder [1];
var[2] = encValues.encoder [2];
var[3] = encValues.encoder [3];
var[4] = encValues.encoder [4];
var[5] = encValues.encoder [5];
var[6] = encValues.encoder [6];
var[7] = encValues.encoder [7];
}