Hi,
dc42:
If it's sensitive to the length of time spent doing the calibration then I think you are only just running out of memory. Did you try the suggestions I made in reply #4 ? They are all very easy to implement.
thanks. Yes, it seems it's time sensitive. Regarding "good practices" about programming, I'm a totally newbie... But trying it. There's lot of errors, but now the code works:
// First multiplexer CD4067 for rows
// where analogRead (3) collects signals
// Mux reader signal
int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;
int SIG_pin = A0;
// Second mux CD4067 for columns
// where voltage is applied
// Mux apply voltage
int v1 = 4;
int v2 = 5;
int v3 = 6;
int v4 = 7;
int VOL_pin = 3;
//Counting for digital select pins of mux
int r0 = 0;
int r1 = 0;
int r2 = 0;
int r3 = 0;
int rowCount = 0;
int colCount = 0;
//there are 16x16 intersections, so 256 sensors
int matrixValues[16];
int matrixSize = 1*16;
int val [16][16]; //declare array for a 16x16 analog matrix calibration sensor
int ledPin = 13; //to check that all runs
int maxVal [16][16]; // needs to declare = 0, but done by default
int minVal [16][16]; // needs to be declared as 1023, still don't know how
// so ensure good pressure when calibrating !!!
void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode (SIG_pin, INPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
pinMode(v1, OUTPUT);
pinMode(v2, OUTPUT);
pinMode(v3, OUTPUT);
pinMode(v4, OUTPUT);
pinMode (VOL_pin, OUTPUT);
digitalWrite(v1, LOW);
digitalWrite(v2, LOW);
digitalWrite(v3, LOW);
digitalWrite(v4, LOW);
analogWrite (VOL_pin, LOW);
pinMode (ledPin, OUTPUT);
Serial.begin(57600);
// Starts minim calibration
for (rowCount=0; rowCount<16; rowCount++) {
r0 = bitRead(rowCount,0);
r1 = bitRead(rowCount,1);
r2 = bitRead(rowCount,2);
r3 = bitRead(rowCount,3);
digitalWrite(v1, r0);
digitalWrite(v2, r1);
digitalWrite(v3, r2);
digitalWrite(v4, r3);
analogWrite (VOL_pin, HIGH);
for (colCount=0; colCount<16; colCount++) {
// select the bit
r0 = bitRead(colCount,0);
r1 = bitRead(colCount,1);
r2 = bitRead(colCount,2);
r3 = bitRead(colCount,3);
digitalWrite(s0, r0);
digitalWrite(s1, r1);
digitalWrite(s2, r2);
digitalWrite(s3, r3);
Serial.print ("Calibrating min sensor ");
Serial.print (colCount);
Serial.print(",");
Serial.print (rowCount);
Serial.println("");
for (int i=0; i< 5; i++) {
digitalWrite(ledPin, HIGH); //to ensure that every cycle runs
delay (1);
digitalWrite(ledPin, LOW);
val [colCount][rowCount]= analogRead (SIG_pin);
if (val [colCount][rowCount] < minVal [colCount][rowCount]){
minVal [colCount][rowCount] = val [colCount][rowCount];}
}
}
}
while(Serial.available() == 0); {
if (Serial.available()) {
int ser = Serial.read();
if(ser == 'c') {
int rowCount = 0;
int colCount = 0;
for (rowCount=0; rowCount<16; rowCount++) {
r0 = bitRead(rowCount,0);
r1 = bitRead(rowCount,1);
r2 = bitRead(rowCount,2);
r3 = bitRead(rowCount,3);
digitalWrite(v1, r0);
digitalWrite(v2, r1);
digitalWrite(v3, r2);
digitalWrite(v4, r3);
analogWrite (VOL_pin, HIGH);
for (colCount=0; colCount<16; colCount++) {
// select the bit
r0 = bitRead(colCount,0);
r1 = bitRead(colCount,1);
r2 = bitRead(colCount,2);
r3 = bitRead(colCount,3);
digitalWrite(s0, r0);
digitalWrite(s1, r1);
digitalWrite(s2, r2);
digitalWrite(s3, r3);
Serial.print ("Calibrating max sensor ");
Serial.print (colCount);
Serial.print(",");
Serial.print (rowCount);
Serial.println("");
while(Serial.available() == 0); {
if (Serial.available()) {
int ser2 = Serial.read();
if(ser2 == 'n') {
for (int i=0; i< 5; i++) {
digitalWrite(ledPin, HIGH); //to ensure that every cycle runs
delay (1);
digitalWrite(ledPin, LOW);
val [colCount][rowCount]= analogRead (SIG_pin);
if (val [colCount][rowCount] < maxVal [colCount][rowCount]){
maxVal [colCount][rowCount] = val [colCount][rowCount];}
}
}
}
}
}
}
}
}
}
}
void loop () {
for (rowCount=0; rowCount<16; rowCount++) {
// select the bit
r0 = bitRead(rowCount,0);
r1 = bitRead(rowCount,1);
r2 = bitRead(rowCount,2);
r3 = bitRead(rowCount,3);
digitalWrite(v1, r0);
digitalWrite(v2, r1);
digitalWrite(v3, r2);
digitalWrite(v4, r3);
digitalWrite (ledPin, LOW);
analogWrite (VOL_pin, HIGH);
Serial.print(rowCount);
Serial.print(",");
for (colCount=0; colCount<16; colCount++) {
r0 = bitRead(colCount,0);
r1 = bitRead(colCount,1);
r2 = bitRead(colCount,2);
r3 = bitRead(colCount,3);
digitalWrite(s0, r0);
digitalWrite(s1, r1);
digitalWrite(s2, r2);
digitalWrite(s3, r3);
val [colCount][rowCount]= analogRead (SIG_pin);
matrixValues [colCount]= map(val [colCount][rowCount], minVal [colCount][rowCount], maxVal [colCount][rowCount], 0, 255);
}
for (int i=0; i<16; i++){
Serial.print(matrixValues[i]);
if (i < matrixSize - 1) Serial.print(",");
}
Serial.println();
delay(20);
}
}
In this way I solve the overflow. Anyway, there's a lot of things I'm learning now that will require different code, so I hope to make some progress while trying it. And at least this code is just one concept. Now I'm working with another code with some different aproach.
Thanks a lot,
toni