Вольтметр Arduino

 

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
     ADMUX = _BV(MUX5) | _BV(MUX0) ;
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  
 
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring
 
  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both
 
  long result = (high<<8) | low;
 
  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}

float vcc, ai;
unsigned long vcc2=0, ai2=0;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  for(int i=0;i<100;i++)
  {
    vcc2 = vcc2 + readVcc();
    ai2 = ai2 + analogRead(0);
  }
  vcc=(vcc2/100)/1000.0;
  Serial.print("VCC:");
  Serial.print(vcc);
  ai=((ai2/100)/ 1023.0) * vcc;
  Serial.print(" ai:");
  Serial.println(ai);
  vcc2=0;
  ai2=0;
}

 

Вам может также понравиться...

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.