- ESP32 Güç Ölçer için Gerekli Malzemeler
- Arduino ve ESP32 Tabanlı Verimlilik Ölçer - Devre Şeması
- Arduino ve ESP32 Tabanlı Verimlilik Ölçer için PCB Tasarımı
- Arduino ve ESP32 Tabanlı Verimlilik Ölçer - Kod
- Arduino ve ESP32 Tabanlı Verimlilik Ölçeri Test Etme
- Diğer Geliştirmeler
Hepimiz, herhangi bir elektronik proje veya devrede değerleri ölçmek için ihtiyaç duyduğunuz üç temel şey olan temel bir voltmetre, ampermetre ve wattmetrelerin farkındayız. Bir multimetre yardımıyla voltaj ve akımı ölçmek, başlamak için iyi bir yol olabilir, ancak bir devreyi test ederken karşılaştığım en büyük sorunlardan biri, güç verimliliğini ölçmektir. Bu nedenle, bugün bu sorunu, giriş voltajını, giriş akımını, çıkış voltajını ve çıkış akımını ölçebilen bir Arduino ve ESP32 tabanlı verimlilik ölçer oluşturarak çözeceğiz . Böylelikle giriş gücünü ve çıkış gücünü aynı anda ölçebilir ve bu değerlerle verimliliği kolayca ölçebiliriz. Daha önce, Arduino Tabanlı Wattmetre projemizde de çok benzer bir şey yaptık, ancak burada hem giriş gücünü hem de çıkış gücünü ölçeceğiz. güç verimliliğini hesaplar.
İş için dört metre satın almaktansa, bu sorunu dört metrenin tümünün yeteneklerini bir araya getirerek çözebileceğiz. Dijital ölçüm cihazınızı inşa etmek yalnızca maliyeti düşürmekle kalmaz, aynı zamanda yükseltmeler ve iyileştirmeler için size bir esneklik sağlar. Bu projeyi oluşturmak için bir ESP32 kullandığımızdan, bu sayacı IoT'yi kolayca etkinleştirebilir ve gelecekteki projenin konusu olan web üzerinden verileri kaydedebiliriz. Tüm temel bilgiler temizlendiğinde, hemen işe koyulalım.
Not: Bu güç ölçer, DC devreleri için tasarlanmıştır. AC akımını hesaplanan AC güç verimliliğiyle ölçmek istiyorsanız, IoT tabanlı Elektrik Enerjisi Ölçer ve Ön Ödemeli Enerji Ölçer Projelerine göz atabilirsiniz.
ESP32 Güç Ölçer için Gerekli Malzemeler
Aşağıdaki resim, devreyi oluşturmak için kullanılan malzemeleri göstermektedir. Bu çok genel bileşenlerle yapıldığından, listelenen tüm malzemeleri yerel hobi mağazanızda bulabilmeniz gerekir.
Gerekli miktar ile birlikte aşağıdaki bileşenleri de listeledim. Devreyi kendiniz inşa ediyorsanız, aşağıdaki listeden tüm malzemeleri almanız şiddetle tavsiye edilir.
- ESP32 Kartı - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC Varil Jakı - 1
- 100 uF Kapasitör - 2
- 104pF - 2
- 102pF - 2
- 10K,% 1 - 4
- 68K,% 1 - 2
- 6,8 bin,% 1 - 2
Arduino ve ESP32 Tabanlı Verimlilik Ölçer - Devre Şeması
Arduino ve ESP32 Tabanlı Verimlilik Ölçer için şematik aşağıda gösterilmiştir. Bu devreyi oluşturmak çok basittir ve genel bileşenler kullanır.
Devrenin çalışması çok basittir. Bu projede voltaj ve akımı benzersiz bir şekilde ölçeceğiz. Hem giriş hem de çıkış için voltaj ve akımı ölçüyoruz, dolayısıyla devrenin verimliliğini görebiliyoruz. Bu, bazı projeler için çok kullanışlıdır. Bir örnek, verimlilik ölçümünün zorunlu hale geldiği bir DC'den DC'ye dönüştürücü olabilir. Bu devrenin çalışma şekli aşağıda açıklanmıştır.
ACS712 Akım Sensörü IC:
Yukarıdaki resimde görebileceğiniz gibi, akımı ölçmek için bir ACS712 Akım Sensörü IC kullanıyoruz. Bu, akımı ölçmek için Hall etkisini kullandığı için çok ilginç bir IC'dir, bu IC'nin piyasada bulunabilen üç çeşidi vardır (veya 5A, 20A ve 30A). Bunun 20A varyantını kullanıyoruz ve ACS712-20 olarak etiketlenmiş.
ACS712 veri sayfası, sorunsuz çalışması için 4,5 - 5,5 voltaj aralığı önerir. Ve akımı bir ESP32 ile ölçeceğimiz için, yalnızca 3,3V toleranslıdır, bu yüzden ACS712 IC'nin çıkış voltajını düşürmek için iki 10K dirençli bir voltaj bölücü kullandım. IC'den akım geçmediğinde, 2.5V çıkarır ve IC'den bir miktar akım geçtiğinde, akım akış yönüne bağlı olarak ya voltajı düşürür ya da voltajı arttırır. Giriş ve çıkış akımını ölçmek için bu IC'lerden ikisini kullandık. Bu ACS712 Sensörünü kullandığımız önceki projelerimize (aşağıda) göz atın.
- Arduino ve ESP8266 Wi-Fi modülünü kullanan IoT Tabanlı Elektrik Enerjisi ölçer
- PIC Mikrodenetleyici ve ACS712 kullanan Dijital Ampermetre Devresi
Bu sensörlerin çalışmasını ayrıntılı olarak tartıştığımız yer. Bu sensörler hakkında daha fazla bilgi edinmek istiyorsanız bunları kontrol edebilirsiniz.
Gerilim Bölücü:
Giriş ve çıkış voltajını ölçmek için, devrenin giriş ve çıkış tarafında iki voltaj bölücümüz var. Devrenin ölçebileceği maksimum gerilim 35V'dur ancak gerilim bölücü için direnç değerleri değiştirilerek kolaylıkla değiştirilebilir.
Voltaj Regülatörü:
ESP32, OLED ve ACS712 IC'lere güç sağlamak için genel bir LM7805 voltaj regülatörü kullanılır. Oldukça temiz bir güçle güçlendirdiğimiz için, dekuplaj kapasitörleri kullanılmıyor, ancak IC'yi stabilize etmek için hem giriş hem de çıkışta 100uF kapasitörler kullandık.
ESP32 IC ve OLED Ekran:
Tüm okumalardan, hesaplamalardan, girişlerden ve çıktılardan sorumlu olan ana işlemci olarak bir ESP32 kullandık. Ayrıca, değerleri bilmek için 128X64 OLED ekran kullandık.
Arduino ve ESP32 Tabanlı Verimlilik Ölçer için PCB Tasarımı
Arduino ve ESP32 Tabanlı Verimlilik Ölçerimiz için PCB, tek taraflı bir kart üzerinde tasarlanmıştır. PCB'mi tasarlamak için Eagle'ı kullandım, ancak istediğiniz herhangi bir tasarım yazılımını kullanabilirsiniz. Kart tasarımımın 2D görüntüsü aşağıda gösterilmektedir.
Tüm bileşenler arasında doğru toprak bağlantıları yapmak için yeterli toprak izi kullanılır. Ayrıca, gürültüyü azaltmak ve verimliliği artırmak için uygun 5V ve 3.3V izleri kullandığımızdan emin olduk.
- PCB Design ve GERBER dosyalarını indirin Arduino ve ESP32 Tabanlı Verimlilik ölçer
El yapımı PCB:
Kolaylık sağlamak ve test etmek için PCB'nin el yapımı versiyonunu yaptım ve aşağıda gösteriliyor. İlk versiyonda, bazı jumper kabloları kullanarak düzelttiğim bazı hatalar yaptım. Ama son versiyonda bunları düzelttim, sadece dosyaları indirip kullanabilirsiniz.
Arduino ve ESP32 Tabanlı Verimlilik Ölçer - Kod
Şimdi, şeylerin donanım tarafını iyi anladığımıza göre, Arduino IDE'yi açabilir ve kodlamaya başlayabiliriz. Kodun amacı, ESP32 kartının 35 ve 33 numaralı pinlerinden analog voltajı okumaktır. Ayrıca akım değeri olan 32 ve 34 pininden voltajı okuyoruz. Bunu yaptıktan sonra, girdi gücü ve çıktı gücü elde etmek için bunları çarpabiliriz ve bunu verimlilik formülüne koyabiliriz, verimliliği elde edebiliriz.
Son olarak LCD ekranda görüntülüyoruz. Aynı şeyi yapmak için programın tamamı, yukarıda tartışılan donanım için olduğu gibi kullanılabilen sonunda verilmiştir. Ayrıca, kod küçük parçalara bölünür ve açıklanır.
128X64 OLED ekran kullandığımız için, ekranla iletişim kurmak için Adafruit_GFX kitaplığına ve Adafruit_SSD1306 kitaplığına ihtiyacımız var. Her ikisini de Arduino'nun varsayılan pano yöneticisi terminalinden indirebilirsiniz; Pano yöneticisi kısmıyla ilgili herhangi bir sorun yaşıyorsanız, kitaplıkları aşağıda verilen ilgili GitHub deposundan da indirebilir ve dahil edebilirsiniz.
- Adafruit_GFX kitaplığını indirin
- Adafruit_SSD1306 kitaplığını indirin
Her zaman olduğu gibi, gerekli tüm kitaplıkları ekleyerek kodumuza başlarız. Ardından aşağıda gösterilen tüm gerekli pinleri ve değişkenleri tanımlıyoruz.
#Dahil etmek
SCREEN_WIDTH ve SCREEN_HEIGHT tanımlar ekran boyutu tanımlamak için kullanılır. Ardından, voltajı ve akımı ölçeceğimiz tüm gerekli pimleri tanımladık. Daha sonra şematikten de görebileceğiniz gibi donanımda kullanılan direnç değerlerini tanımladık. Bu değerlere sahip değilseniz veya sayacın aralığını değiştirmek istiyorsanız, bu değerleri değiştirebilirsiniz, kod gayet iyi çalışacaktır.
Akımı ölçmek için bir ACS712 kullandığımız için, akımı voltajdan hesaplamak için mVperAmp değerine ihtiyacımız var. 20A ACS712 modülü kullandığım için mV / A değeri veri sayfasında verildiği gibi 100'dür. Fakat bir ESP32 ve bir voltaj bölücü kullandığımız için, 50 olan değerin yarısına sahip olacağız ve bu yüzden mV / AMP değerini koyduk.
ACSoffset , akımın voltajdan hesaplanması için gereken ofsettir. ACS712 IC'lere 5V ile güç verildiğinden, ofset voltajı 2,5V'tur. Ancak voltaj bölücü kullandığımız için 1,25V'a düşüyor. ESP32'nin berbat ADC'sini zaten biliyor olabilirsiniz, bu yüzden 1136 değerini kullanmak zorunda kaldım. Kalibrasyon sorunları yaşıyorsanız, değerleri değiştirebilir ve ADC'yi telafi edebilirsiniz.
Son olarak, Adafruit_SSD1306 sınıfının bir görüntüleme nesnesini yaparak ve ekran genişliğini, yüksekliğini, I 2 C yapılandırmasını geçerek ve sıfırlama işlevini tanımlamak için son -1 parametresini geçerek bu bölümü bitiriyoruz. Ekranınızın harici bir sıfırlama pimi yoksa (ki bu kesinlikle benim ekranım için), son argüman için -1 kullanmanız gerekir.
geçersiz kurulum () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// 128x64 Serial.println için 0x3D adresi (F ("SSD1306 tahsisi başarısız oldu")); için (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); gecikme (100); }
Ardından, kurulum () bölümümüz var. Bu bölümde, hata ayıklama için seriyi etkinleştiriyoruz, görüntüleme nesnesinin başlangıç yönteminin yardımıyla bir I 2 C ekranın mevcut olup olmadığını kontrol ediyoruz. Ayrıca I 2 C adresini de ayarladık. Daha sonra ekranı clearDisplay () yöntemiyle temizliyoruz . Ayrıca, ekranı setRotation yöntemiyle döndürüyoruz çünkü PCB tasarımımı bozmuştum . Ardından, işlevlerin etkili olması için 100 ms'lik bir gecikme koyuyoruz. Bunu yaptıktan sonra, şimdi döngü işlevine geçebiliriz. Ama döngü fonksiyonu geçmeden önce, biz iki diğer işlevleri tartışmak gerekir return_voltage_value () , ve return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; çift ADCVoltaj = 0; çift giriş Voltajı = 0; çift ortalama = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } ort = tmp / 150; ADCVoltage = ((ortalama * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // yani GND dönüş giriş voltajında voltaj hesaplama formülü; }
Return_voltage_value () fonksiyonu ADC gelen voltaj ölçmek için kullanılır ve bir argüman olarak pin_no sürer. Bu fonksiyonda, tmp, ADCVoltage, inputVoltage ve avg gibi bazı değişkenleri tanımlayarak başlıyoruz. Tmp değişkeni, analogRead () işlevinden aldığımız geçici ADC değerini depolamak için kullanılır, ardından bir for döngüsünde 150 kez ortalamasını alırız ve değeri avg adlı bir değişkene saklarız. Daha sonra verilen formülden ADCVoltage'i hesaplıyoruz, son olarak giriş voltajını hesaplıyoruz ve değerleri döndürüyoruz. Gördüğünüz +0.138 değeri, voltaj seviyesini kalibre etmek için kullandığım kalibrasyon değeridir, herhangi bir hata alırsanız bu değerle oynayın.
double return_current_value (int pin_no) {double tmp = 0; çift ortalama = 0; çift ADCVoltaj = 0; çift Amper = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } ort = tmp / 150; ADCVoltage = ((ortalama / 4095.0) * 3300); // Size mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); dönüş Amper; }
Sonra, return_current_value () fonksiyonumuz var. Bu işlev ayrıca pin_no'yu bağımsız değişken olarak alır. Bu işlevde ayrıca dört değişkenimiz var. tmp, avg, ADCVoltage ve Amps
Daha sonra analogRead () fonksiyonu ile pimi okuyup 150 kez ortalamasını alıyoruz, daha sonra ADC voltajını hesaplamak için formülü kullanıyoruz, bununla akımı hesaplıyoruz ve değeri döndürüyoruz. Bununla döngü bölümüne geçebiliriz.
void döngü () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs (return_current_value (INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs (return_voltage_value (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current - 0,025; Seri.print ("Giriş Voltajı:"); Serial.print (input_voltage); Seri.print ("- Giriş Akımı:"); Serial.print (input_current); Seri.print ("- Çıkış Voltajı:"); Serial.print (output_voltage); Seri.print ("- Çıkış Akımı:"); Serial.println (output_current); gecikme (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); Görüntüle.baskı ("V"); }
Döngü bölümünü dört değişkenin hepsinde bazı float değişkenleri tanımlayarak ve tanımlayarak başlatıyoruz. ACS712 modülü mevcut değerleri negatif olarak döndürebildiğinden, pin_no'yu argüman olarak geçirerek ilgili işlevleri çağırıyoruz. Negatif değeri pozitif yapmak için matematik kütüphanesinin abs () işlevini kullanırız. Ardından, hata ayıklama için tüm değerleri seri olarak yazdırıyoruz. Ardından, ekranı temizliyoruz, imleci ayarlıyoruz ve değerleri yazdırıyoruz. Bunu ekranda gösterilen tüm karakterler için yapıyoruz. Döngü fonksiyonunun ve programın sonunu işaretler.
Arduino ve ESP32 Tabanlı Verimlilik Ölçeri Test Etme
Test kurulumumu yukarıdaki resimde görebileceğiniz gibi. Giriş olarak 30V transformatörüm var ve ölçüm cihazım test panosuna bağlı. Yük için LM2596 tabanlı bir kova dönüştürücü kart kullanıyorum ve paralel olarak üç adet 10 Ohm direnç kullanıyorum.
Yukarıdaki görüntüde görebileceğiniz gibi, giriş ve çıkış voltajını kontrol etmek için multi-metreye bağladım. Transformatör neredeyse 32V üretir ve buck dönüştürücünün çıkışı 3.95V'dur.
Buradaki görüntü, verimlilik ölçerim ve multimetre tarafından ölçülen çıkış akımını göstermektedir. Gördüğünüz gibi, multimetre.97 Amper gösteriyor ve biraz yakınlaştırırsanız, 1.0A gösteriyor, ACS712 modülünde bulunan doğrusal olmama nedeniyle biraz kapalı, ancak bu bizim amacımıza hizmet ediyor. Detaylı bir açıklama ve test için video bölümümüzde videoya göz atabilirsiniz.
Diğer Geliştirmeler
Bu gösterim için devre, el yapımı bir PCB üzerinde yapılmıştır, ancak devre kolayca kaliteli bir PCB'de kurulabilir. Deneyimde, PCB'nin boyutu, bileşen boyutundan dolayı gerçekten büyük, ancak bir üretim ortamında, ucuz SMD bileşenleri kullanılarak azaltılabilir. Devre ayrıca herhangi bir yerleşik koruma özelliğine sahip değildir, bu nedenle bir koruma devresi dahil etmek, devrenin genel güvenlik yönünü iyileştirecektir. Ayrıca, kodu yazarken, ESP32'nin ADC'sinin o kadar da iyi olmadığını fark ettim. ADS1115 modülü gibi harici bir ADC dahil etmek, genel kararlılığı ve doğruluğu artıracaktır.
Umarım bu makaleyi beğenmiş ve ondan yeni bir şeyler öğrenmişsindir. Herhangi bir şüpheniz varsa, aşağıdaki yorumlarda sorabilir veya detaylı tartışma için forumlarımızı kullanabilirsiniz.