- ESP32功率计所需的材料
- 基于Arduino和ESP32的效率表-电路图
- 基于Arduino和ESP32的效率计的PCB设计
- 基于Arduino和ESP32的效率表-代码
- 测试基于Arduino和ESP32的效率计
- 进一步增强
我们都知道基本的电压表,电流表和功率表,这是测量任何电子项目或电路上的值所需的三个基本要素。借助万用表测量电压和电流可能是一个很好的开始,但是我在测试电路时面临的最大问题之一就是 测量电源效率。因此,今天我们将通过构建一个基于Arduino和ESP32的效率计来解决该问题,该效率计可以 测量输入电压,输入电流,输出电压和输出电流。 因此,它可以同时测量输入功率和输出功率,利用这些值,我们可以轻松地测量效率。以前,我们在基于Arduino的Wattmeter项目中也做过非常相似的事情,但是在这里我们将测量输入功率和输出功率 计算功率效率。
与其购买四米的工作表,不如将四米的功能合并为一个,就能解决这个问题。构建数字仪表不仅可以降低成本,而且还为您提供了升级和改进的空间。由于我们使用ESP32来构建此项目,因此我们可以轻松地使此仪表具有IoT功能并通过Web记录数据,这是未来项目的主题。在清除所有基础知识之后,让我们开始吧。
注意:此功率计是为直流电路设计的。如果您要测量交流电流以计算出交流功率效率,则可以查看基于IoT的电能表和预付费电能表项目。
ESP32功率计所需的材料
下图显示了用于构建电路的材料。由于这是由非常通用的组件组成的,因此您应该能够在本地的业余爱好商店中找到所有列出的材料。
我还列出了以下组件以及所需数量。如果您自己构建电路,强烈建议从下面的列表中获取所有材料。
- ESP32开发板-1
- 128X64 OLED-1
- ACS712-20 IC-2
- 直流桶式千斤顶-1
- 100uF电容器-2
- 104pF-2
- 102pF-2
- 10K,1%-4
- 68K,1%-2
- 6.8K,1%-2
基于Arduino和ESP32的效率表-电路图
基于Arduino和ESP32的效率表的原理图 如下所示。创建此电路非常简单,并使用通用组件。
电路的操作非常简单。我们将以一种独特的方式来测量该项目中的电压和电流。我们正在测量输入和输出的电压和电流,因此我们可以看到电路的效率。对于某些项目,这非常方便。一个示例是DC-DC转换器,其中必须进行效率测量。这些电路的工作方式如下所述。
ACS712电流传感器IC:
如上图所示,我们正在使用 ACS712电流传感器IC 来测量电流。这是一个非常有趣的IC,因为它使用 霍尔效应 来测量电流,在市场f(或5A,20A和30A)中可以找到该IC的三种变体。我们正在使用20A的变体,它被标记为ACS712-20。
ACS712数据表建议在4.5-5.5的电压范围内正常运行。当我们要使用ESP32测量电流时,它只能承受3.3V的电压,这就是为什么我使用带有两个10K电阻的分压器来降低ACS712 IC的输出电压的原因。当没有电流流过IC时,它会输出2.5V,而当有电流流过IC时,它会根据电流的流向降低电压或提高电压。我们已经使用其中的两个IC来测量输入和输出电流。查看我们使用此ACS712传感器的先前项目(如下)。
- 使用Arduino和ESP8266 Wi-Fi模块的基于IoT的电能表
- 使用PIC单片机和ACS712的数字电流表电路
我们在哪里详细讨论了这些传感器的工作原理。如果您想进一步了解这些传感器,可以查看这些内容。
分压器:
为了测量输入和输出电压,我们 在电路的输入和输出侧有两个 分压器。该电路可以测量的最大电压为35V,但是可以通过更改分压器的电阻值轻松更改。
稳压器:
通用LM7805稳压器用于为ESP32,OLED和ACS712 IC供电。当我们使用相当干净的电源为其供电时,不使用任何去耦电容器,但我们在输入和输出端均使用了100uF电容器来稳定IC。
ESP32 IC和OLED显示屏:
我们使用ESP32作为主处理器,负责所有的读数,计算,输入和输出。另外,我们使用了128X64 OLED显示屏来了解这些值。
基于Arduino和ESP32的效率计的PCB设计
我们的Arduino和基于ESP32的效率计的PCB设计在单侧板上。我已经使用Eagle来设计PCB,但是您可以使用任何选择的设计软件。我的电路板设计的2D图像如下所示。
足够的接地线用于在所有组件之间进行正确的接地连接。此外,我们确保使用正确的5V和3.3V走线以减少噪声并提高效率。
- 下载PCB设计和GERBER文件基于Arduino和ESP32的效率表
手工PCB:
为了方便和测试,我制作了手工制作的PCB版本,如下所示。在第一个版本中,我犯了一些错误,并使用了一些跳线进行了纠正。但是在最终版本中,我修复了这些问题,您可以下载文件并使用它们。
基于Arduino和ESP32的效率表-代码
现在,我们对硬件方面有了很好的了解,我们可以打开Arduino IDE并开始我们的编码。该代码的目的是从ESP32板的引脚35和33读取模拟电压。另外,我们从32和34引脚读取电压,这是当前值。一旦执行此操作,我们可以将它们相乘以获得输入功率和输出功率,并将其放在效率公式中,就可以得到效率。
最后,我们将其显示在LCD屏幕上。最后,给出了完成此操作的完整程序,可以将其用于上述硬件。此外,该代码分为小片段并进行了解释。
当我们使用128X64 OLED显示器时,我们需要 Adafruit_GFX库 和 Adafruit_SSD1306库 与显示器进行通信。您可以从Arduino的默认板管理器终端中下载它们。如果您对董事会经理部分有任何疑问,也可以从与其关联的GitHub存储库中下载并包含库,如下所示。
- 下载Adafruit_GFX库
- 下载Adafruit_SSD1306库
与往常一样,我们通过包含所有必需的库开始我们的代码。然后,我们定义所有必需的引脚和变量,如下所示。
#包括
所述 SCREEN_WIDTH & SCREEN_HEIGHT 定义用于定义屏幕尺寸。接下来,我们定义了所有必需的引脚,通过这些引脚我们将测量电压和电流。接下来,我们定义了电阻值,这些电阻值在硬件中使用,如从原理图中可以看到的。如果没有这些值,或者要更改仪表的范围,则可以更改这些值,代码将正常工作。
当我们使用ACS712测量电流时,我们需要 mVperAmp 值来根据电压计算电流。当我使用20A ACS712模块时,数据表中给出的mV / A值为100。但是,因为我们使用的是ESP32和分压器,所以只有一半的值是50,这就是为什么要输入mV / AMP值的原因。
ACSoffset 是从电压计算电流所需的偏移量。由于ACS712 IC由5V供电,因此失调电压为2.5V。但是,当我们使用分压器时,它会降至1.25V。您可能已经知道ESP32糟糕的ADC,所以我必须使用值1136。如果遇到校准问题,可以调整这些值并补偿ADC。
最后,我们通过制作 Adafruit_SSD1306 类的显示 对象 并传递屏幕的宽度,高度,I 2 C配置和最后一个-1参数用于定义重置功能来完成本节 。如果您的显示器没有外部复位引脚(这肯定是我的显示器),那么最后一个参数必须使用-1。
void setup(){Serial.begin(115200); if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){// 128x64 Serial.println(F(“ SSD1306分配失败”))的地址0x3D 为(;;); } display.clearDisplay(); display.setRotation(2); display.setTextSize(1); 延迟(100); }
接下来,我们有 setup() 部分。在本节中,我们将启用串行调试功能,并借助显示对象的begin方法检查I 2 C显示是否可用。另外,我们设置I 2 C地址。接下来,我们使用 clearDisplay() 方法清除显示内容 。另外,我们使用 setRotation 方法旋转显示器 ,这是因为我搞砸了PCB设计。接下来,我们将100 ms的延迟生效。完成后,我们现在可以继续循环功能。但是,在进行循环功能之前,我们需要讨论另外两个功能,这些功能 )return_voltage_value( , 和 return_current_value() 。
double return_voltage_value(int pin_no){double tmp = 0;双ADCVoltage = 0; double inputVoltage = 0;平均双倍= 0; for(int i = 0; i <150; i ++){tmp = tmp + AnalogRead(pin_no); } avg = tmp / 150; ADC电压=((平均* 3.3)/(4095))+ 0.138; inputVoltage = ADCVoltage /(R2_VOLTAGE /(R1_VOLTAGE + R2_VOLTAGE)); //计算电压的公式,即GND return inputVoltage; }
所述 return_voltage_value() 函数是用来测量进入该ADC的电压,并且它需要的pin_no作为参数。在此函数中,我们首先声明一些变量,它们是tmp,ADCVoltage,inputVoltage和avg。 tmp变量用于存储从analogRead() 函数获得的临时ADC值 ,然后在for循环中将其取平均值150次,然后将该值存储到一个称为avg的变量中。然后,根据给定的公式计算ADCVoltage,最后,计算输入电压并返回值。您看到的+0.138值是我用来校准电压电平的校准值,如果遇到任何错误,请尝试使用该值。
double return_current_value(int pin_no){double tmp = 0; 平均双倍= 0; 双ADCVoltage = 0; 双安培= 0; for(int z = 0; z <150; z ++){tmp = tmp + AnalogRead(pin_no); } avg = tmp / 150; ADCVoltage =((平均/ 4095.0)* 3300); //获得mV Amps =((ADCVoltage-ACSoffset)/ mVperAmp); 返回安培; }
接下来,我们有 return_current_value() 函数。此函数还使用pin_no作为参数。在此函数中,我们还有四个变量viz。tmp,avg,ADCVoltage和Amps
接下来,我们使用 analogRead() 函数读取该引脚 并将其取平均值150次,然后使用公式计算ADC电压,然后计算电流并返回该值。这样,我们就可以进入循环部分了。
void loop(){float input_voltage = abs(return_voltage_value(INPUT_VOLTAGE_SENSE_PIN));;浮点输入电流= abs(返回电流值(INPUT_CURRENT_SENSE_PIN));浮动输出电压= abs(返回电压值(OUTPUT_VOLTAGE_SENSE_PIN));浮动输出电流= abs((return_current_value(OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current-0.025; Serial.print(“ Input Voltage:”); Serial.print(输入电压); Serial.print(“-输入电流:”); Serial.print(input_current); Serial.print(“-输出电压:”); Serial.print(输出电压); Serial.print(“-输出电流:”); Serial.println(output_current);延迟(300); display.clearDisplay(); display.setCursor(0,0); display.print(“ I / PV:”); display.setCursor(37,0); display.print(input_voltage); display.setCursor(70,0);显示。print(“ V”); }
我们通过在所有四个变量中声明并定义一些float变量来开始循环部分。我们调用相应的函数,将pin_no作为参数传递,因为ACS712模块可以返回负的当前值。我们使用数学库的 abs() 函数将负值设为正。接下来,我们串行打印所有值以进行调试。接下来,我们清除显示,设置光标,然后打印值。我们对显示屏中显示的所有字符执行此操作。这标志着循环功能和程序的结束。
测试基于Arduino和ESP32的效率计
您可以在上图中看到我的测试设置。我将30V变压器作为输入,并将仪表连接到测试板。我使用的是基于LM2596的降压转换器板,并且用于负载,并且我使用了三个并联的10欧姆电阻。
如上图所示,我已连接到万用表以检查输入和输出电压。变压器产生几乎32V的电压,降压转换器的输出为3.95V。
此处的图像显示了由效率计和万用表测得的输出电流。如您所见,万用表显示为0.97安培,如果稍微放大一点,则显示为1.0A,由于ACS712模块中存在非线性,它略有偏离,但这符合我们的目的。有关详细说明和测试,您可以在我们的视频部分中查看视频。
进一步增强
在本演示中,电路是在手工PCB上制成的,但是可以轻松地在高质量PCB中构建该电路。在我的实验中,由于组件尺寸的原因,PCB的尺寸确实很大,但是在生产环境中,可以通过使用廉价的SMD组件来减小PCB的尺寸。该电路还没有任何内置保护功能,因此包括保护电路将改善电路的整体安全性。另外,在编写代码时,我注意到ESP32的ADC并不是那么好。包括一个外部ADC(如ADS1115模块)将提高整体稳定性和准确性。
希望您喜欢本文并从中学到新东西。如有任何疑问,可以在下面的评论中提问,也可以使用我们的论坛进行详细讨论。