Firtec

Medición en cuatro canales con Arduino Mega.

El siguiente es un ejemplo de como hacer cuatro lecturas en cuatro canales analógicos distintos en una placa Arduino Mega.
Se toman cinco lecturas en cada canal (cinco interrupciones por canal), luego se busca el promedio de estas cinco lecturas, se escala el resultado para convertirlo a voltios y finalmente se muestra la información en una pantalla LCD hd 44780 tipo 2004.
Se leen los canales AN0, AN1, AN2 y AN3.

/*******************************************************************
 * Descripción:Lectura de cuatro canales analógicos. 
 *             Este programa utiliza la interrupción del 
 *             conversor A/D.
 * Placa Arduino: MEGA 2560
 * Arduino IDE: 1.8.5
 *
 * www.firtec.com.ar
*******************************************************************/

#include "LiquidCrystal.h" 	// Biblioteca para el LCD
#define ledPin 13		// Pin del LED de la placa Mega
// -------- Variables del programa ---------------------------------
byte adc_Pin = 0;
volatile unsigned char muestras_0=0,muestras_1=0,muestras_2=0,muestras_3=0;
volatile unsigned int M0=0,M1=0,M2=0,M3=0;
volatile float conversion,conv_0,conv_1,conv_2,conv_3;
char buffer[10]=" ";
char* buffn="";

//               RS E  datos
LiquidCrystal lcd(8,9,4,5,6,7); // Pines del LCD

/********************************************************************
 * Función para la configuración del Hardware
 * Argumentos: NINGUNO
 * Retorna: NADA
 *
*********************************************************************/
void setup (){
  lcd.begin(20,4);
  pinMode(ledPin, OUTPUT); // Pin del LED de la placa
  digitalWrite(13,LOW );   // LED inicia apagado
  ADCSRA =  bit (ADEN);                      		// Inicia el ADC
  ADCSRA |= bit (ADPS0) |  bit (ADPS1) | bit (ADPS2);  	// Prescaler en 128
  ADMUX  =  bit (REFS0) | (adc_Pin & 0x07);    // Incia en el canal 0
  //ADMUX  = 0x40;
  lcd.setCursor(0,0);
  lcd.print("Voltaje A0: ");
  lcd.setCursor(0,1);
  lcd.print("Voltaje A1: ");
  lcd.setCursor(0,2);
  lcd.print("Voltaje A2: ");
  lcd.setCursor(0,3);
  lcd.print("Voltaje A3: ");
 }  
/********************************************************************
 * Función ISR para la lectura de los canales analógicos.
 * Interrumpe 5 veces en cada canal para leer y promediar la lectura
 * de cada canal.
 * Argumentos: NINGUNO
 * Retorna: NADA
 *
*********************************************************************/
ISR (ADC_vect){
switch(adc_Pin){
   case 0:{
        M0 += ADC;			// Acumula los datos en M0
        muestras_0++;
                if(muestras_0 == 5){	// Se tomaron 5 muestras?
                     conv_0 = M0/5;	// Promedia la muestras
                     muestras_0 =0;	// Limpia registros
                     M0=0;
                     adc_Pin++;		// Prepara el siguiente canal
                     ADMUX  =  bit (REFS0) | (adc_Pin & 0x07);
             }
        break;
      }
   case 1:{
        M1 += ADC;
        muestras_1++;
                if(muestras_1 == 5){
                     conv_1 = M1/5;
                     muestras_1 =0;
                     M1=0;
                     adc_Pin++;
                     //adc_Pin = 0;
                     ADMUX  =  bit (REFS0) | (adc_Pin & 0x07);
               }
          break;
      }
    case 2:{
        M2 += ADC;
        muestras_2++;
                if(muestras_2 == 5){
                     conv_2 = M2/5;
                     muestras_2 =0;
                     M2=0;
                     adc_Pin++;
                     ADMUX  =  bit (REFS0) | (adc_Pin & 0x07);
               }
          break;
      } 
    case 3:{
        M3 += ADC;
        muestras_3++;
                if(muestras_3 == 5){
                     conv_3 = M3/5;
                     muestras_3 =0;
                     M3=0;
                     adc_Pin = 0;
                     ADMUX  =  bit (REFS0) | (adc_Pin & 0x07);
               }
          break;
      }     
   } 
  }  
/********************************************************************
 * Función pincipal del programa, escala y muestra los datos.
 ********************************************************************/
void loop (){  
  //------ Escala el canal 0 -------
    conversion = (conv_0 *5.0)/1024;
    dtostrf(conversion,2,2,buffn); 
    sprintf(buffer,"%s", buffn);
    lcd.setCursor(11,0);
    lcd.print(buffer);
  //------ Escala el canal 1 -------
    conversion = (conv_1 *5.0)/1024;
    dtostrf(conversion,2,2,buffn); 
    sprintf(buffer,"%s", buffn);
    lcd.setCursor(11,1);
    lcd.print(buffer);

    //------ Escala el canal 2 -------
    conversion = (conv_2 *5.0)/1024;
    dtostrf(conversion,2,2,buffn); 
    sprintf(buffer,"%s", buffn);
    lcd.setCursor(11,2);
    lcd.print(buffer);

    //------ Escala el canal 3 -------
    conversion = (conv_3 *5.0)/1024;
    dtostrf(conversion,2,2,buffn); 
    sprintf(buffer,"%s", buffn);
    lcd.setCursor(11,3);
    lcd.print(buffer);
   
    ADCSRA |= bit (ADSC) | bit (ADIE);
} 
 

El resultado del ejemplo es el siguiente.

Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.