ERROR: 'ch_select' was not declared in this scope

Hi,
The code compiling got error need help please.
Thanks.
Adam

#include <LiquidCrystal.h>   // include Arduino LCD library
// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

#include "ACDC.h"

*/

void setup(void)
{
    lcd.begin(16, 2);     // set up the LCD's number of columns and rows
  lcd.setCursor(1, 0);
  lcd.print("Voltage:");

 }

// analog comparator ISR
ISR (ANALOG_COMP_vect)
{
  byte count = 0;
  for (byte i = 0; i < 50; i++) {
    if ( ACSR & 0x20 )
      count++;
  }

  if (count > 48)
    per++;
}

// main loop
void loop()
{

   ACDC.ACDCLoop();

  
}

void ch_select(byte n) {
  switch (n) {
    case 0:
      digitalWrite(CH0, HIGH);
      digitalWrite(CH1, LOW);
      digitalWrite(CH2, LOW);
      digitalWrite(CH3, LOW);
      break;
    case 1:
      digitalWrite(CH0, LOW);
      digitalWrite(CH1, HIGH);
      digitalWrite(CH2, LOW);
      digitalWrite(CH3, LOW);
      break;
    case 2:
      digitalWrite(CH0, LOW);
      digitalWrite(CH1, LOW);
      digitalWrite(CH2, HIGH);
      digitalWrite(CH3, LOW);
      break;
    case 3:
      digitalWrite(CH0, LOW);
      digitalWrite(CH1, LOW);
      digitalWrite(CH2, LOW);
      digitalWrite(CH3, HIGH);
  }
  current_res = res_table[n];
}

SUB:

class ACDCMeter {

//// private:

  // define autoranging channel pins
#define CH0  2
#define CH1  3
#define CH2  4
#define CH3  5

const uint16_t Time_Out = 50000,  // time out in microseconds
               Periods  = 10;     // number of periods of measurement (for AC voltage only)

// variables
byte ch_number;
const uint16_t res_table[4] = {2444, 244, 94, 47},  // voltage divider resistances in tenths kOhms
                              total_res = 22444;                   // total resistance in tenths kOhms
uint16_t current_res;
volatile byte per;

//// public:

void ACDCSetup(void)
{
  
  pinMode(CH0, OUTPUT);
  pinMode(CH1, OUTPUT);
  pinMode(CH2, OUTPUT);
  pinMode(CH3, OUTPUT);

/*

  lcd.begin(16, 2);     // set up the LCD's number of columns and rows
  lcd.setCursor(1, 0);
  lcd.print("Voltage:");

  */
  
  ch_number = 0;
  ch_select(ch_number);

  // ADC and analog comparator configuration
  ADMUX  = 0x03;
  ADCSRA = 0x87;
  ADCSRB = (0 << ACME);  // select AIN1 as comparator negative input
  ACSR   = 0x13;         // turn on analog comparator

}


  // main loop
void ACDCLoop()
{
  
  bool dc_flag = 0; // DC voltage flag bit
  int32_t sum = 0;  // sum of all readings
  uint16_t n = 0;   // number of readings (samples)

  ACSR = (1 << ACI);   // clear analog comparator interrupt flag
  ACSR = (1 << ACIE);  // enable analog comparator interrupt

  uint32_t current_m = micros();  // save current millis
  byte current_per = per;         // save current period number
  while ( (current_per == per) && (micros() - current_m < Time_Out) ) ;

  if( micros() - current_m >= Time_Out ) {  // if there's time out event ==> voltage signal is DC
    dc_flag = 1;
    for (byte i = 0; i < 200; i++) {
      ADCSRA |= 1 << ADSC;   // start conversion
      while(ADCSRA & 0x40);  // wait for conversion complete
      int16_t an = (int16_t)(ADCL | (uint16_t)ADCH << 8) - 511;
      sum += an;
      n++;         // increment number of readings
      delay(1);
    }
  }

  else {   // here, voltage signal is AC
    current_m = micros();  // save current millis()
    per = 0;
    while ( (per < Periods) && (micros() - current_m < (uint32_t)Time_Out * Periods) ) {
      ADCSRA |= 1 << ADSC;   // start conversion
      while(ADCSRA & 0x40);  // wait for conversion complete
      int32_t an = (int16_t)(ADCL | (uint16_t)ADCH << 8) - 511;
      sum += sq(an);  // sq: square
      n++;            // increment number of readings
    }
  }

  ACSR = (0 << ACIE);  // disable analog comparator interrupt
  uint32_t total_time = micros() - current_m;  // used to claculate frequency

  // voltage calculation
  float v;
  if(dc_flag)   // if voltage signal is DC
    v = (4 * sum)/n;   // calculate Arduino analog channel DC voltage in milli-Volts

  else  // here voltage signal is AC
    v = 4 * sqrt(sum/n);   // calculate Arduino analog channel RMS voltage in milli-Volts

  // claculate actual (input) voltage in milli-Volts (apply voltage divider equation)
  v = v * (float)total_res/current_res;
  v /= 1000;  // get voltage in Volts

  uint16_t v_abs = abs(int16_t(v));
  if( (v_abs >= 10 && ch_number == 0) || (v_abs >= 100 && ch_number == 1) || (v_abs >= 250 && ch_number == 2) ) {
    ch_number++;
    ch_select(ch_number);
    delay(10);
    return;
  }

  if( (v_abs < 220 && ch_number == 3) || (v_abs < 80 && ch_number == 2) || (v_abs < 8 && ch_number == 1) ) {
    ch_number--;
    ch_select(ch_number);
    delay(10);
    return;
  }

  char _buffer[8];
  lcd.setCursor(0, 1);
  if( v < 0)
    lcd.print('-');
  else
    lcd.print(' ');
  if(v_abs < 10)
    sprintf( _buffer, "%01u.%02u", v_abs, abs((int16_t)(v * 100)) % 100 );
  else if( v_abs < 100)
    sprintf( _buffer, "%02u.%01u", v_abs, abs((int16_t)(v * 10)) % 10 );
  else
    sprintf( _buffer, "%03u ", v_abs );

  lcd.print(_buffer);
  if(dc_flag)
    lcd.print("VDC        ");
  else {
    lcd.print("VAC ");
    // calculate signal frequency in Hz
    uint32_t period_time = total_time/Periods;
    float freq = 1000000.0/period_time;
    sprintf( _buffer, "%02u.%02uHz", (uint16_t)freq % 100, (uint16_t)(freq * 100) % 100 );
    lcd.print(_buffer);
  }

  delay(500);    // wait half a second

}

};



ACDCMeter ACDC; 


ERROR:

Arduino: 1.8.13 (Windows 7), Board: "Arduino Uno"





















C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\HUA.DELLV-PC\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\HUA.DELLV-PC\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\HUA.DELLV-PC\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10813 -build-path C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_build_421210 -warnings=none -build-cache C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_cache_812812 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino

C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\HUA.DELLV-PC\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\HUA.DELLV-PC\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\HUA.DELLV-PC\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10813 -build-path C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_build_421210 -warnings=none -build-cache C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_cache_812812 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino

Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr

Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr

Detecting libraries used...

"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\sketch\\0_Auto_Range_Vmeter_M2.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Alternatives for LiquidCrystal.h: [LiquidCrystal-1.0.7@1.0.7]

ResolveLibrary(LiquidCrystal.h)

  -> candidates: [LiquidCrystal-1.0.7@1.0.7]

"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Users\\HUA.DELLV-PC\\Documents\\Arduino\\libraries\\LiquidCrystal-1.0.7\\src" "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\sketch\\0_Auto_Range_Vmeter_M2.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE

Using cached library dependencies for file: C:\Users\HUA.DELLV-PC\Documents\Arduino\libraries\LiquidCrystal-1.0.7\src\LiquidCrystal.cpp

Generating function prototypes...

"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Users\\HUA.DELLV-PC\\Documents\\Arduino\\libraries\\LiquidCrystal-1.0.7\\src" "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\sketch\\0_Auto_Range_Vmeter_M2.ino.cpp" -o "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\preproc\\ctags_target_for_gcc_minus_e.cpp" -DARDUINO_LIB_DISCOVERY_PHASE

"C:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\preproc\\ctags_target_for_gcc_minus_e.cpp"

Compiling sketch...

"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Users\\HUA.DELLV-PC\\Documents\\Arduino\\libraries\\LiquidCrystal-1.0.7\\src" "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\sketch\\0_Auto_Range_Vmeter_M2.ino.cpp" -o "C:\\Users\\HUA~1.DEL\\AppData\\Local\\Temp\\arduino_build_421210\\sketch\\0_Auto_Range_Vmeter_M2.ino.cpp.o"

In file included from E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino:14:0:

C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_build_421210\sketch\ACDC.h: In member function 'void ACDCMeter::ACDCSetup()':

ACDC.h:40:3: error: 'ch_select' was not declared in this scope

   ch_select(ch_number);

   ^~~~~~~~~

C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_build_421210\sketch\ACDC.h: In member function 'void ACDCMeter::ACDCLoop()':

ACDC.h:108:5: error: 'ch_select' was not declared in this scope

     ch_select(ch_number);

     ^~~~~~~~~

ACDC.h:115:5: error: 'ch_select' was not declared in this scope

     ch_select(ch_number);

     ^~~~~~~~~

E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino: In function 'void __vector_23()':

0_Auto_Range_Vmeter_M2:74:5: error: 'per' was not declared in this scope

     per++;

     ^~~

E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino: In function 'void loop()':

0_Auto_Range_Vmeter_M2:81:18: error: 'void ACDCMeter::ACDCLoop()' is private within this context

    ACDC.ACDCLoop();

                  ^

In file included from E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino:14:0:

C:\Users\HUA~1.DEL\AppData\Local\Temp\arduino_build_421210\sketch\ACDC.h:52:6: note: declared private here

 void ACDCLoop()

      ^~~~~~~~

E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino: In function 'void ch_select(byte)':

0_Auto_Range_Vmeter_M2:112:3: error: 'current_res' was not declared in this scope

   current_res = res_table[n];

   ^~~~~~~~~~~

0_Auto_Range_Vmeter_M2:112:17: error: 'res_table' was not declared in this scope

   current_res = res_table[n];

                 ^~~~~~~~~

E:\ENGINEERING\DIY\Electronic\meter\Arduino Multimeter\03_Arduino Based Autoranging AC-DC Voltmeter with TRMS\0_Auto_Range_Vmeter_M2\0_Auto_Range_Vmeter_M2.ino:112:17: note: suggested alternative: 'Printable'

   current_res = res_table[n];

                 ^~~~~~~~~

                 Printable

Using library LiquidCrystal-1.0.7 at version 1.0.7 in folder: C:\Users\HUA.DELLV-PC\Documents\Arduino\libraries\LiquidCrystal-1.0.7 

exit status 1

'ch_select' was not declared in this scope


i get other errors (trying to piece together ACDC.h which you didn't post)

Tst:5:2: error: expected unqualified-id before '/' token
 */
  ^
Tst:5:2: error: expected constructor, destructor, or type conversion before '/' token
C:\stuff\SW\Arduino\_Others\Tst\Tst.ino: In function 'void __vector_23()':
Tst:21:5: error: 'per' was not declared in this scope
     per++;
     ^~~
C:\stuff\SW\Arduino\_Others\Tst\Tst.ino: In function 'void loop()':
Tst:27:5: error: 'ACDC' was not declared in this scope
     ACDC.ACDCLoop();
     ^~~~
C:\stuff\SW\Arduino\_Others\Tst\Tst.ino:27:5: note: suggested alternative: 'ACIC'
     ACDC.ACDCLoop();
     ^~~~
     ACIC
C:\stuff\SW\Arduino\_Others\Tst\Tst.ino: In function 'void ch_select(byte)':
Tst:33:22: error: 'CH0' was not declared in this scope
         digitalWrite(CH0, HIGH);
                      ^~~
Tst:34:22: error: 'CH1' was not declared in this scope
         digitalWrite(CH1, LOW);
                      ^~~
Tst:35:22: error: 'CH2' was not declared in this scope
         digitalWrite(CH2, LOW);
                      ^~~
Tst:36:22: error: 'CH3' was not declared in this scope
         digitalWrite(CH3, LOW);
                      ^~~
Tst:56:5: error: 'current_res' was not declared in this scope
     current_res = res_table[n];
     ^~~~~~~~~~~
Tst:56:19: error: 'res_table' was not declared in this scope
     current_res = res_table[n];
                   ^~~~~~~~~
C:\stuff\SW\Arduino\_Others\Tst\Tst.ino:56:19: note: suggested alternative: 'Printable'
     current_res = res_table[n];
                   ^~~~~~~~~
                   Printable
exit status 1
expected unqualified-id before '/' token

1 Like

Thanks.
The second code is ACDC.h.
The original sketch that the sketch above splitted from as below:

#include <LiquidCrystal.h>   // include Arduino LCD library
// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

// define autoranging channel pins
#define CH0  2
#define CH1  3
#define CH2  4
#define CH3  5

const uint16_t Time_Out = 50000,  // time out in microseconds
              Periods  = 10;     // number of periods of measurement (for AC voltage only)

// variables
byte ch_number;
const uint16_t res_table[4] = {2444, 244, 94, 47},  // voltage divider resistances in tenths kOhms
              total_res = 22444;                   // total resistance in tenths kOhms
uint16_t current_res;
volatile byte per;

void setup(void)
{
 pinMode(CH0, OUTPUT);
 pinMode(CH1, OUTPUT);
 pinMode(CH2, OUTPUT);
 pinMode(CH3, OUTPUT);

 lcd.begin(16, 2);     // set up the LCD's number of columns and rows
 lcd.setCursor(1, 0);
 lcd.print("Voltage:");
//// lcd.print("Hello!");

 ch_number = 0;
 ch_select(ch_number);

 // ADC and analog comparator configuration
 ADMUX  = 0x03;
 ADCSRA = 0x87;
 ADCSRB = (0 << ACME);  // select AIN1 as comparator negative input
 ACSR   = 0x13;         // turn on analog comparator

}

// analog comparator ISR
ISR (ANALOG_COMP_vect)
{
 byte count = 0;
 for(byte i = 0; i < 50; i++) {
   if ( ACSR & 0x20 )
     count++;
 }

 if(count > 48)
   per++;
}

// main loop
void loop()
{
 bool dc_flag = 0; // DC voltage flag bit
 int32_t sum = 0;  // sum of all readings
 uint16_t n = 0;   // number of readings (samples)

 ACSR = (1 << ACI);   // clear analog comparator interrupt flag
 ACSR = (1 << ACIE);  // enable analog comparator interrupt

 uint32_t current_m = micros();  // save current millis
 byte current_per = per;         // save current period number
 while ( (current_per == per) && (micros() - current_m < Time_Out) ) ;

 if( micros() - current_m >= Time_Out ) {  // if there's time out event ==> voltage signal is DC
   dc_flag = 1;
   for (byte i = 0; i < 200; i++) {
     ADCSRA |= 1 << ADSC;   // start conversion
     while(ADCSRA & 0x40);  // wait for conversion complete
     int16_t an = (int16_t)(ADCL | (uint16_t)ADCH << 8) - 511;
     sum += an;
     n++;         // increment number of readings
     delay(1);
   }
 }

 else {   // here, voltage signal is AC
   current_m = micros();  // save current millis()
   per = 0;
   while ( (per < Periods) && (micros() - current_m < (uint32_t)Time_Out * Periods) ) {
     ADCSRA |= 1 << ADSC;   // start conversion
     while(ADCSRA & 0x40);  // wait for conversion complete
     int32_t an = (int16_t)(ADCL | (uint16_t)ADCH << 8) - 511;
     sum += sq(an);  // sq: square
     n++;            // increment number of readings
   }
 }

 ACSR = (0 << ACIE);  // disable analog comparator interrupt
 uint32_t total_time = micros() - current_m;  // used to claculate frequency

 // voltage calculation
 float v;
 if(dc_flag)   // if voltage signal is DC
   v = (4 * sum)/n;   // calculate Arduino analog channel DC voltage in milli-Volts

 else  // here voltage signal is AC
   v = 4 * sqrt(sum/n);   // calculate Arduino analog channel RMS voltage in milli-Volts

 // claculate actual (input) voltage in milli-Volts (apply voltage divider equation)
 v = v * (float)total_res/current_res;
 v /= 1000;  // get voltage in Volts

 uint16_t v_abs = abs(int16_t(v));
 if( (v_abs >= 10 && ch_number == 0) || (v_abs >= 100 && ch_number == 1) || (v_abs >= 250 && ch_number == 2) ) {
   ch_number++;
   ch_select(ch_number);
   delay(10);
   return;
 }

 if( (v_abs < 220 && ch_number == 3) || (v_abs < 80 && ch_number == 2) || (v_abs < 8 && ch_number == 1) ) {
   ch_number--;
   ch_select(ch_number);
   delay(10);
   return;
 }

 char _buffer[8];
 lcd.setCursor(0, 1);
 if( v < 0)
   lcd.print('-');
 else
   lcd.print(' ');
 if(v_abs < 10)
   sprintf( _buffer, "%01u.%02u", v_abs, abs((int16_t)(v * 100)) % 100 );
 else if( v_abs < 100)
   sprintf( _buffer, "%02u.%01u", v_abs, abs((int16_t)(v * 10)) % 10 );
 else
   sprintf( _buffer, "%03u ", v_abs );

 lcd.print(_buffer);
 if(dc_flag)
   lcd.print("VDC        ");
 else {
   lcd.print("VAC ");
   // calculate signal frequency in Hz
   uint32_t period_time = total_time/Periods;
   float freq = 1000000.0/period_time;
   sprintf( _buffer, "%02u.%02uHz", (uint16_t)freq % 100, (uint16_t)(freq * 100) % 100 );
   lcd.print(_buffer);
 }

 delay(500);    // wait half a second

}

void ch_select(byte n) {
 switch(n) {
   case 0:
     digitalWrite(CH0, HIGH);
     digitalWrite(CH1, LOW);
     digitalWrite(CH2, LOW);
     digitalWrite(CH3, LOW);
     break;
   case 1:
     digitalWrite(CH0, LOW);
     digitalWrite(CH1, HIGH);
     digitalWrite(CH2, LOW);
     digitalWrite(CH3, LOW);
     break;
   case 2:
     digitalWrite(CH0, LOW);
     digitalWrite(CH1, LOW);
     digitalWrite(CH2, HIGH);
     digitalWrite(CH3, LOW);
     break;
   case 3:
     digitalWrite(CH0, LOW);
     digitalWrite(CH1, LOW);
     digitalWrite(CH2, LOW);
     digitalWrite(CH3, HIGH);
 }
 current_res = res_table[n];
}