// Practica 2 - ADC + ARINC 429 + LED de falla
// ESP32 - Arduino IDE
const int ADC_PIN = 34; // Cursor del potenciometro
const int LED_FALLA = 4; // LED rojo indicador de falla
const float VREF = 3.3f;
const float ANGLE_MAX_DEG = 300.0f;
const float FLAP_MAX_DEG = 45.0f;
const int ADC_MAX = 4095;
const int UMBRAL_MIN = (int)(ADC_MAX * 0.02); // ~82
const int UMBRAL_MAX = (int)(ADC_MAX * 0.98); // ~4013
// Filtro de media movil (N = 8)
const int MA_SIZE = 8;
int maBuf[MA_SIZE] = {0};
long maSum = 0;
int maIdx = 0, maCount = 0;
unsigned long lastRead = 0;
int maAdd(int x) {
maSum -= maBuf[maIdx];
maBuf[maIdx] = x;
maSum += x;
maIdx = (maIdx + 1) % MA_SIZE;
if (maCount < MA_SIZE) maCount++;
return (int)(maSum / maCount);
}
// Genera palabra ARINC 429 BNR (Label 270, paridad impar)
uint32_t generarArincWord(int label_oct, int dato, uint8_t ssm) {
// Convierte el literal octal (ej. 270) a su valor real en binario
int label_int = 0, mult = 1, temp = label_oct;
while (temp > 0) {
label_int += (temp % 10) * mult;
mult *= 8;
temp /= 10;
}
uint32_t word = ((uint32_t)ssm << 29) | ((uint32_t)dato << 10) | label_int;
int ones = 0;
uint32_t tmp = word;
while (tmp) { ones += (tmp & 1); tmp >>= 1; }
if (ones % 2 == 0) word |= (1UL << 31); // forzar paridad impar
return word;
}
void setup() {
Serial.begin(115200);
pinMode(ADC_PIN, INPUT);
pinMode(LED_FALLA, OUTPUT);
digitalWrite(LED_FALLA, LOW);
analogReadResolution(12); // fuerza lectura de 0-4095
Serial.println("t_ms,raw,avg,voltage_v,angle_deg,flap_deg,ssm,arinc_hex");
}
void loop() {
if (millis() - lastRead >= 10) { // 100 Hz
lastRead = millis();
int raw = analogRead(ADC_PIN);
int avg = maAdd(raw);
float v = ((float)avg / ADC_MAX) * VREF;
float ang = (v / VREF) * ANGLE_MAX_DEG;
float flap = (v / VREF) * FLAP_MAX_DEG;
uint8_t ssm = (raw < UMBRAL_MIN || raw > UMBRAL_MAX) ? 0b00 : 0b11;
digitalWrite(LED_FALLA, ssm == 0b00 ? HIGH : LOW);
uint32_t word = generarArincWord(270, avg, ssm);
Serial.printf("%lu,%d,%d,%.3f,%.1f,%.1f,%s,0x%08lX\n",
millis(), raw, avg, v, ang, flap,
ssm == 0b11 ? "OK" : "FAIL", word);
}
}