ARDUINO TO AVR

Submitted by Uzair on Mon, 02/24/2020 - 00:44

Hi is anyone able to help me convert this arduino code to avr. Trying to make a sound pressure level meter using the same idea as this link https://circuitdigest.com/microcontroller-projects/arduino-sound-level-measurement just need to change the code to avr. I am using the atmega 164p.

const int MIC = 0; //the microphone amplifier output is connected to pin A0
int adc;
int dB, PdB; //the variable that will hold the value read from the microphone each time

void setup() {
Serial.begin(9600); //sets the baud rate at 9600 so we can check the values the microphone is obtaining on the Serial Monitor
  pinMode(3, OUTPUT);
}

void loop(){

  PdB = dB; //Store the previous of dB here
  
adc= analogRead(MIC); //Read the ADC value from amplifer 
//Serial.println (adc);//Print ADC for initial calculation 
dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values

if (PdB!=dB)
Serial.println (dB);

if (dB>60)
{
  digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(2000);                       // wait for a second
  digitalWrite(3, LOW); 
}
//delay(100);

}

Use the following code format

#include <avr/io.h>
#include <util/delay.h>
 

void adc_init()
{
    // AREF = AVcc
    ADMUX = (1<<REFS0);
 
    // ADC Enable and prescaler of 128
    // 16000000/128 = 125000
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
 
// read adc value
uint16_t adc_read(uint8_t ch)
{
    // select the corresponding channel 0~7
    // ANDing with '7' will always keep the value
    // of 'ch' between 0 and 7
    ch &= 0b00000111;  // AND operation with 7
    ADMUX = (ADMUX & 0xF8)|ch;     // clears the bottom 3 bits before ORing
 
    // start single conversion
    // write '1' to ADSC
    ADCSRA |= (1<<ADSC);
 
    // wait for conversion to complete
    // ADSC becomes '0' again
    // till then, run loop continuously
    while(ADCSRA & (1<<ADSC));
 
    return (ADC);
}
 
int main()
{
    uint16_t adc;
    char int_buffer[10];
    DDRC = 0x01;           //output pin
 
    // initialize adc
    adc_init();
 
    while(1)
    {
        adc = adc_read(0);      // read adc value at PA0
     
        int dB = (adc+83.2073) / 11.003; //Convert ADC value to dB using Regression values

if (dB>60)
{
  PORTC=0X01;
  _delay_ms(2000);                       // wait for a second
  PORTC=0X00;
}
    }
}

  Joined August 22, 2019      125
Thursday at 12:29 PM

Thank you so much. Have you done a project similar to this before  https://circuitdigest.com/microcontroller-projects/arduino-sound-level-measurement. Just wanted to know if this will work for the ATMEGA 164p. My teachers have said I need a rectifier after the amplfication of the circuit but Im not sure if one is present in this circuit or if I do need one. Thanks again

  Joined January 28, 2020      5
Tuesday at 09:05 PM

Hi Im also getting a warning that int_buffer is an unused varaible do you know the fix to this. Thanks.

  Joined January 28, 2020      5
Tuesday at 09:05 PM

You can remove all the unused variables from the code.That's why warning is coming

  Joined August 22, 2019      125
Thursday at 12:29 PM

jaksonlee

Permalink

 Arduino is a prototiping board, and also the term "Arduino" is used to referr to the IDE and library on the PC side, and all its ecosystem. AVR is the architecture of the microcontroller chip used in all official 8bit board, and almost all clone.

  Joined November 07, 2019      124
Thursday at 04:25 PM