Measure up to 500A DC Current with a Shunt and Arduino TM1637 Display
Using this code and video is about measuring DC current up to 500A using the 75mV shunt resistor. The current is displayed on a TM1637 4-digit LED display.
328-Arduino to measure DC current using a 75mV shunt up to 500A
语言: C++
++
/*
* This Arduino code is to measure DC Current using a 75mV shunt up to 500A
* 50A 75mV, 100A 75mV, 200A 75mV, 300A, 500A
* and display the current on a TM1637 4-digit LED display.
*
* Watch Video instructions for this code: https://youtu.be/M6IFUdVoDT4
*
* Written by Ahmad Shamshiri on May 15, 2020 at 03:19 in Ajax, Ontario, Canada
* in Ajax, Ontario, Canada. www.robojax.com
*
* Get this code and other Arduino codes from Robojax.com.
Learn Arduino step by step in a structured course with all material, wiring diagrams, and libraries
all in one place. Purchase my course on Udemy.com: http://robojax.com/L/?id=62
If you found this tutorial helpful, please support me so I can continue creating
content like this. You can support me on Patreon: http://robojax.com/L/?id=63
or make a donation using PayPal: http://robojax.com/L/?id=64
* * 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 <https://www.gnu.org/licenses/>.
*/
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 float minimumCurrent =5.0;
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;
//***** TM1637 Settings Starts
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 5
#define DIO 6
TM1637Display display(CLK, DIO);
uint8_t blank[] = { 0x0, 0x0, 0x0, 0x0 };
float current_TM1637;
//***** TM1637 Settings Ends
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);
display.setBrightness(0x0f);
}
// the loop routine runs over and over again forever:
void loop() {
//robojax.com 50A Shunt Current Measurement with TM1637
//display.setSegments(blank); //clear display
display.showNumberDec(getCurrent(), false, 4,0);
// printDebug();
//printCurrent();
//getCurrent();
delay(1000);
}
/*
* 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(1);
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);
if(averageSensorValue >=minimumCurrent){
return averageSensorValue;
}else{
return 0.0;
}
}//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
文件📁
没有可用的文件。