Voltmetre

ESP32 ve ADS1115 ile Hassas Ölçümlü Voltmetre yapımı

Bu yazımızda normal ESP32 modellerinde mümkün olmayan bir hassaslık ile gerilim ölçer yani “Voltmetre” kurmayı ve programlamayı öğreteceğiz. Üstelik Topway dokunmatik ekran kullanarak okuduğumuz verileri anlık olarak grafik haline getirip istediğimiz uzaklık ve hız ile ekranda kaydıracağız. Sağlıklı çalışan bir Voltmetre yapmak için ESP32 içinde bulunan ADC özelliğini kullanacağız. Ancak ADC tek başına çok kötü bir hassaslığa sahip olduğundan, ADS1115 diye isimlendiren bir modül ile çok hassas analog okuma yapabileceğiz.

Bu sorun ESP32 s3 modellerinde çözülmüştür, başka bir yazımızda s3 incelemesini de gerçekleştireceğiz.

Gerekli Malzemeler

Kodlar

/****************************************Copyright (c)****************************************************
**                             		Fixaj  Mehmet YILDIZ
**
**                             		https://fixaj.com/  
**
** Tüm hizmetler Mehmet Yıldız şirketi Fixaj tarafından sağlanmaktadır.
** FİXAJ MAĞAZALARIMIZ DIŞINDA SATIN ALINAN TOPWAY MARKA DOKUNMATİK EKRANLARDA BU KÜTÜPHANENİN TİCARİ OLARAK KULLANIMI YASAKTIR.
** Herhangi bir program, belge, test sonucu, çözüm, destek ve diğer malzeme ve bilgiler yalnızca referans amaçlıdır
** ve müşterilerin kullanmama veya atıfta bulunma ve kendileri tarafından değişiklik yapma hakları vardır.
** Müşterinin kullanımı sırasında herhangi bir özel, tesadüfi veya dolaylı kayıp meydana gelirse, 
** herhangi bir bütünlük, güvenilirlik ve diğer garantileri sağlamak için şirket sorumlu olmayacaktır.
** HERHANGİ BİR SORUMLULUĞUN KABUL EDİLMEMESİ.
**                                                                        Fixaj
**
**
**--------------File Info-------------------------------------------------------------------------------
** Modified by:            	MEHMET YILDIZ
** Modified date:        	  23.06.2023
** Version:                	v0.1
** Description:    
 
********************************************************************************************************/


#include <HardwareSerial.h>
#include <FixajEkran.h>
#include <Adafruit_ADS1X15.h>

Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
//Adafruit_ADS1015 ads; /* Use this for the 12-bit version */
float transformedValue = 0.0;

//#define graf 0x060000
#define graf 0x0602bc
#define volt 0x080002

#define RX 17  //  Lora nın 3. pini RX in ESP 32 de hangi pine bağlı olduğu
#define TX 16  // Lora nın 4. pini TX in ESP 32 de hangi pine bağlı olduğu

#define SIZE 350        // Array boyutu
#define OFFSET 0        // Orta değer (genliği 2'ye böleriz)
#define AMPLITUDE 1000  // Maksimum genlik

int sin_wave[SIZE];  // Sinüs dalgası için array
INT16U Alog[SIZE];

HardwareSerial fixajSerial(2);  //esp32 hardware serial kullanıyoruz
FixajEkran FixajSS(TX, RX, &fixajSerial, UART_BPS_RATE_115200_Ekran);

int16_t adc0, adc1, adc2, adc3;
float volts0, volts1, volts2, volts3;

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
  delay(100);
  FixajSS.begin();
  delay(500);
  if (!FixajSS.EkranTest()) {
    Serial.println("bağlantı hatası, kabloları kontrol edin");  //ESP yi veya NANO yu PCB den çıkarıp programı yükleyin sonra PCB takın
                                                                //Ekran nın Baud Rate ni de ayarlamayı unutmuş olabilirsiniz.
                                                                //SGTools programından projenize sağ tıklayın Prpject properties-> Baud rate
                                                                //sonra arayüz tasarımını tekrar Ekrana yükleyin.
  }
  delay(100);
  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    while (1)
      ;
  }

  ads.setDataRate(uint16_t RATE_ADS1115_860SPS);
  Serial.println("Fixaj.com Basliyor...");
}

void loop() {


  for (int i = 0; i < SIZE; i++) {
    memmove(&(Alog[0]), &(Alog[1]), (SIZE - 1) * sizeof(Alog[0]));
    adc0 = ads.readADC_SingleEnded(0);
    volts0 = ads.computeVolts(adc0);

    Alog[SIZE - 1] = (int)round(mapFloat(volts0, 0, 3.29, 0, 309.0));

    //ekran yenileme hızı.
    if (i % 3 == 0) {
      FixajSS.grafikCiz(graf, SIZE, Alog);
    }
  }

  FixajSS.yaz(volt, Alog[SIZE - 1]);
  Serial.println(".");
}


float mapFloat(float x, float x1, float x2, float y1, float y2) {
  return (x - x1) * (y2 - y1) / (x2 - x1) + y1;
}

Uygulama Dosyalarını İndirmek için tıklayınız