搜索代码

Lesson 104-1: Measuring DC Current Using a Shunt Resistor and Arduino

Lesson 104-1: Measuring DC Current Using a Shunt Resistor and Arduino

In this lesson we learn how to measure current using Shunt Resistor and Arduino. Please watch video and get code for LCD1602 from Lesson 19: Introduction to LCD Screen
405-Lesson 104: Arduino Energy Meter to measure DC voltage, current, power, and energy
语言: C++
/*
 * Lesson 104: This Arduino to measure DC Current using the 75mV Shunt up to 500A
 *  50A 75mV, 100A 75mV, 200A 75mV, 300A, 500A 
 * 

 * 
 * Watch video instructions for this code: https://youtu.be/oufDb7AtvNk
 
 * Written by Ahmad Shamshiri on May 10, 2020 at 04:18 in Ajax, Ontario, Canada
 * in Ajax, Ontario, Canada. www.robojax.com
 * 
* 
 * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * For the library for this code, visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax 

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see .


*/

const int inPin =A0;//can change
const float SHUNT_CURRENT =100.00;//A
const float SHUNT_VOLTAGE =75.0;// mV
const float CORRECTION_FACTOR = 2.00;


const int ITERATION = 50; //can change (see video)
const float VOLTAGE_REFERENCE = 1100.00;//1.1V
const int BIT_RESOLUTION =10;//and 12 for Due and MKR
const boolean DEBUG_ONCE = true;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  Serial.println("Robojax 50A Current for Arduino");
  //for line below see https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference
  analogReference(INTERNAL);//1.1V internal reference
  //analogReadResolution(BIT_RESOLUTION);//only Arduino with Due and MKR
  delay(500);
}

// the loop routine runs over and over again forever:
void loop() {
 //robojax.com 50A Shunt Current Measurement for Arduino
    
  //printDebug();
  printCurrent();
  //getCurrent();


  delay(500);
}

/*
 * getCurrent()
 * @brief gets current
 * @param none

 * @return returns one of the values above
 * Written by Ahmad Shamshiri for robojax.com
 * on May 10, 2020 at 03:05 in Ajax, Ontario, Canada
 */
float getCurrent()
{
 //robojax.com 50A Shunt Current Measurement for Arduino

    float averageSensorValue =0;
    int sensorValue ;
    float voltage, current;

    for(int i=0; i< ITERATION; i++)
    {   
      sensorValue = analogRead(inPin);
      delay(5);
      if(sensorValue !=0 && sensorValue < 100)
      {
        voltage = (sensorValue +0.5) * (VOLTAGE_REFERENCE /  (pow(2,BIT_RESOLUTION)-1)); 
        current  = voltage * (SHUNT_CURRENT /SHUNT_VOLTAGE )  ;
        if(i !=0){
          averageSensorValue += current+CORRECTION_FACTOR;
        }
        delay(1);
      }else{
        i--;
      }
    }    
   //IGNORE_CURRENT_BELOW
    averageSensorValue /=(ITERATION-1);
    return   averageSensorValue;
}//getCurrent()

/*
 * printCurrent()
 * @brief prints the current on the serial monitor
 * @param none
 * @return none
 * Written by Ahmad Shamshiri for robojax.com
 * on May 08, 2020 at 02:45 in Ajax, Ontario, Canada
 */
void printCurrent()
{
   Serial.println("Current:");
   Serial.print(getCurrent(),2);
   Serial.println("A");
   Serial.println();
   
 
}//printCurrent()


/*
 * printDebug()
 * @brief prints the full details of the current measurement
 * @param none
 * @return none
 * Written by Ahmad Shamshiri for robojax.com
 * on May 08, 2020 at 02:45 in Ajax, Ontario, Canada
 */
void printDebug()
{
  //robojax.com 50A Shunt Current Measurement for Arduino
    Serial.print("Debug Details Measuring ");
    Serial.print(ITERATION);
    Serial.println(" Times");
    Serial.print("Reading from pin: \t");
    Serial.println(inPin); 
    
    Serial.print("Shunt Voltage: \t\t");
    Serial.print(SHUNT_VOLTAGE);Serial.println("mV"); 
    Serial.print("Shunt Current: \t\t");
    Serial.print(SHUNT_CURRENT);Serial.println("A"); 
    Serial.print("Voltage Reference: \t");
    Serial.print(VOLTAGE_REFERENCE);Serial.println("mV"); 
    Serial.print("Bits Resolution: \t");
    Serial.print(BIT_RESOLUTION);Serial.println(" bits"); 
    Serial.println();        
    Serial.println("Sensor\tVoltage\t\tCurrent");    
    int sensorValue ;
    float voltage, current;
    float averageCurrentValue=0;

    for(int i=0; i< ITERATION; i++)
    {   
      sensorValue = analogRead(inPin);
      delay(5);
      if(sensorValue !=0 && sensorValue < 100)
      {      
        Serial.print(sensorValue);
        voltage = (sensorValue +0.5) * (VOLTAGE_REFERENCE /  (pow(2,BIT_RESOLUTION)-1)); 
        Serial.print("\t");Serial.print(voltage);  
        current    = voltage * (SHUNT_CURRENT /SHUNT_VOLTAGE )  ;
        if(i !=0) averageCurrentValue += current+CORRECTION_FACTOR;
        Serial.print("mV\t\t");Serial.print(current);Serial.println("A");                    
        delay(100);
      }else{
        i--;
      }
    }    

    averageCurrentValue /=(ITERATION-1);
    Serial.print("Average Current: ");   
    Serial.print(averageCurrentValue);            
    Serial.println("A");  
    Serial.println();   
    while(DEBUG_ONCE);
}//printDebug

文件📁

没有可用的文件。