prima versione in gardo (si spera) di riconoscere gli ingressi analogici guasti. esempi di risultati:
tutto ok:
http://img208.imageshack.us/img208/5258/tuttook.pngdue analogiche bloccate a GND:
http://img35.imageshack.us/img35/6043/dueagnd.pngdue analogiche bloccate a VCC:
http://img413.imageshack.us/img413/4717/dueavcc.pnguna analogica a VCC e una a GND:
http://img41.imageshack.us/img41/8766/unavccunagnd.pngla riga dopo la varianza segnala con un "1" gli ingressi analogici riconosciuti come danneggiati (da sinistra l'analogica 0)
dimenticavo, per far partire l'autodiagnosi si deve mandare "s" via seriale
char inByte;
int val = 0;
int analogPin = 0;
int analogValues[] = {0, 0, 0, 0, 0, 0};
int analogSorted[] = {0, 0, 0, 0, 0, 0};
int analogWrong[] = {0, 0, 0, 0, 0, 0};
float analogMean = 0;
float analogMean_min = 0;
float analogMean_max = 0;
float analogVar = 0;
float analogVar_max = 0;
float analogVar_min = 0;
#define VAR_THRESHOLD 10
int digitalPin;
byte digitalWrong[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#define MAX_ANALOG_PIN 5
#define MAX_DIGITAL_PIN 13
int num_value = MAX_ANALOG_PIN + 1;
void sortAnalog()
{
byte i, j;
int tmp = 0;
for(i = 0; i < 6; i++)
analogSorted[i] = analogValues[i];
for(i = 0; i < 6; i++)
{
for(j = 0; j < 5 - i; j++)
{
if(analogSorted[j] > analogSorted[j + 1])
{
tmp = analogSorted[j];
analogSorted[j] = analogSorted[j + 1];
analogSorted[j + 1] = tmp;
}
}
}
return;
}
void setup()
{
Serial.begin(9600);
for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
{
pinMode(digitalPin, OUTPUT);
digitalWrite(digitalPin, LOW);
}
}
void loop()
{
while(!Serial.available())
;
inByte = Serial.read();
if(inByte == 's')
{
// variable initialization
analogMean = 0;
analogVar = 0;
num_value = MAX_ANALOG_PIN + 1;
Serial.println("parto");
// all digital pins HIGH
for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
{
digitalWrite(digitalPin, HIGH);
}
delay(200);
Serial.print("tutto alto");
Serial.print('\t');
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
val = analogRead(analogPin);
analogValues[analogPin] = val;
analogMean += val;
Serial.print(val);
Serial.print('\t');
}
analogMean /= 6.0;
Serial.print('\n');
Serial.print("valori ordinati\t");
sortAnalog();
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
Serial.print(analogSorted[analogPin]);
Serial.print('\t');
}
Serial.print('\n');
// variance
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
analogVar += abs(analogValues[analogPin] - analogMean);
}
analogVar /= 6.0;
while(analogVar > VAR_THRESHOLD)
{
// measure variance with max value
analogMean_max = analogSorted[1];
for(analogPin = 2; analogPin < num_value; analogPin++)
{
analogMean_max += analogSorted[analogPin];
}
analogMean_max /= (float)(num_value);
analogVar_max = abs(analogSorted[1] - analogMean_max);
for(analogPin = 2; analogPin < num_value; analogPin++)
{
analogVar_max += abs((analogSorted[analogPin] - analogMean_max));
}
// measure variance with min value
analogMean_min = analogSorted[0];
for(analogPin = 1; analogPin < num_value - 1; analogPin++)
{
analogMean_min += analogSorted[analogPin];
}
analogMean_min /= (float)(num_value);
analogVar_min = abs(analogSorted[0] - analogMean_min);
for(analogPin = 1; analogPin < num_value - 1; analogPin++)
{
analogVar_min += abs((analogSorted[analogPin] - analogMean_min));
}
if(analogVar_min > analogVar_max)
{
// delete min value
for(analogPin = 0; analogPin < num_value - 1; analogPin++)
analogSorted[analogPin] = analogSorted[analogPin + 1];
analogVar = analogVar_max;
analogMean = analogMean_max;
}
else
{
// delete max value
analogVar = analogVar_min;
analogMean = analogMean_min;
}
num_value--;
analogVar /= (float)(num_value);
}
// print results
Serial.print("media = \t");
Serial.print(analogMean);
Serial.print('\n');
Serial.print("varianza = \t");
Serial.print(analogVar);
Serial.print('\n');
// check analogIn integrity on everything low
Serial.print("\t\t");
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
if(abs(analogMean - analogValues[analogPin]) > 10)
{
analogWrong[analogPin] = 1;
}
else
{
analogWrong[analogPin] = 0;
}
Serial.print(analogWrong[analogPin]);
Serial.print('\t');
}
Serial.print('\n');
Serial.print("\t\t");
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
Serial.print(abs(analogMean - analogValues[analogPin]));
Serial.print('\t');
}
Serial.print('\n');
// all digital pins LOW
for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
{
digitalWrite(digitalPin, LOW);
}
delay(200);
Serial.print("tutto basso");
Serial.print('\t');
analogMean = 0;
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
val = analogRead(analogPin);
analogMean += val;
Serial.print(val);
Serial.print('\t');
}
Serial.print('\n');
// check analogIn integrity on everything high
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
if(abs(analogMean - analogValues[analogPin]) > 10)
{
analogWrong[analogPin] = 1;
}
}
// find out the first analog pin ok
analogPin = 0;
while(analogWrong[analogPin])
analogPin++;
// check digitalOut integrity whit the first analog ok
for(digitalPin = 2; digitalPin < (MAX_DIGITAL_PIN + 1); digitalPin++)
{
Serial.print("digitale ");
Serial.println(digitalPin);
Serial.print("\tbasso\t");
delay(200);
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
val = analogRead(analogPin);
Serial.print(val);
Serial.print('\t');
}
Serial.print('\n');
digitalWrite(digitalPin, HIGH);
Serial.print("\talto\t");
delay(200);
for(analogPin = 0; analogPin < (MAX_ANALOG_PIN + 1); analogPin++)
{
val = analogRead(analogPin);
Serial.print(val);
Serial.print('\t');
}
Serial.print('\n');
digitalWrite(digitalPin, LOW);
delay(200);
}
Serial.println("fine");
}
else
{
Serial.println("comando errato, riprova");
}
Serial.flush();
}
cose da fare:
- riconoscere la condizione di "nessuna analogica buona rilevata"
- valutare il corretto funzionamenti dei singoli ingressi digitali
edit: ingressi analogici nella prima riga, avevo scritto digitali