esp32 thermistor yazılımı

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
merhaba bir konuda yardıma ihtiyacım var. dht11 ile yapılandırılmış bir kodum var ancak ben bunu dht11 ile değil ntc themistor ile ölçüm yapmak istiyorum kod konusunda destek olabilirmisiniz. teşekkürler

C++:
#include "config.h"

/************************ Example Starts Here *******************************/
#include <Adafruit_Sen2670sor.h>
#include <DHT.h>
#include <DHT_U.h>

// pin connected to DH22 data line
#define DATA_PIN 4

// LED Pin
#define LED_2 12

// you should change these to match PWM pins on other platforms.
#define RED_PIN 18
#define GREEN_PIN 19
#define BLUE_PIN 21c

// create DHT22 instance
DHT_Unified dht(DATA_PIN, DHT11);

// set up the 'temperature' and 'humidity' feeds
AdafruitIO_Feed *temperature = io.feed("Temperature");
AdafruitIO_Feed *humidity = io.feed("Humidity");

// set up the 'led' feed
AdafruitIO_Feed *led = io.feed("1");

// set up the 'pump' feed
AdafruitIO_Feed *pump = io.feed("2");

// set up the 'color' feed
AdafruitIO_Feed *color = io.feed("color");

int x = 0;

void setup()
{

// set LED pin as an output
    pinMode(LED_2, OUTPUT);

// start the serial connection
    Serial.begin(115200);

// wait for serial monitor to open
    while (!Serial)
        ;

#if defined(ARDUINO_ARCH_ESP32) // ESP32 pinMode
// assign rgb pins to channels
    ledcAttachPin(RED_PIN, 1);
    ledcAttachPin(GREEN_PIN, 2);
    ledcAttachPin(BLUE_PIN, 3);
// init. channels
    ledcSetup(1, 12000, 8);
    ledcSetup(2, 12000, 8);
    ledcSetup(3, 12000, 8);
#else
    pinMode(RED_PIN, OUTPUT);
    pinMode(GREEN_PIN, OUTPUT);
    pinMode(BLUE_PIN, OUTPUT);
#endif

// initialize dht22
    dht.begin();

// connect to io.adafruit.com
    Serial.print("Connecting to Adafruit IO");
    io.connect();

    led->onMessage(handleMessage);
    color->onMessage(handleMessageRGB);

// wait for a connection
    while (io.status() < AIO_CONNECTED)
    {
        Serial.print(".");
        delay(500);
    }

// we are connected
    Serial.println();
    Serial.println(io.statusText());

    led->get();
    color->get();
}

void loop()
{

// io.run(); is required for all sketches.
// it should always be present at the top of your loop
// function. it keeps the client connected to
// io.adafruit.com, and processes any incoming data.
    io.run();

    x++;

    if (x == 102)
    {
        sensors_event_t event;
        dht.temperature().getEvent(&event);

        float celsius = event.temperature;
        float fahrenheit = (celsius * 1.8) + 32;

        Serial.print("celsius: ");
        Serial.print(celsius);
        Serial.println("C");

        Serial.print("fahrenheit: ");
        Serial.print(fahrenheit);
        Serial.println("F");

// save fahrenheit (or celsius) to Adafruit IO
        temperature->save(celsius);

        dht.humidity().getEvent(&event);

        Serial.print("humidity: ");
        Serial.print(event.relative_humidity);
        Serial.println("%");
        Serial.println("................");

// save humidity to Adafruit IO
        humidity->save(event.relative_humidity);
        x = 0;
    }
}

void handleMessage(AdafruitIO_Data *data)
{
    Serial.print("received <- ");

    if (data->toPinLevel() == HIGH)
        Serial.println("HIGH");
    else
        Serial.println("LOW");
    digitalWrite(LED_2, data->toPinLevel());
}
void handleMessageRGB(AdafruitIO_Data *data)
{

// print RGB values and hex value
    Serial.println("Received:");
    Serial.print(" - R: ");
    Serial.println(data->toRed());
    Serial.print(" - G: ");
    Serial.println(data->toGreen());
    Serial.print(" - B: ");
    Serial.println(data->toBlue());
    Serial.print(" - HEX: ");
    Serial.println(data->value());

// invert RGB values for common anode LEDs
#if defined(ARDUINO_ARCH_ESP32) // ESP32 analogWrite
    ledcWrite(1, data->toRed());
    ledcWrite(2, data->toGreen());
    ledcWrite(3, data->toBlue());
#else
    analogWrite(RED_PIN, data->toRed());
    analogWrite(GREEN_PIN, data->toGreen());
    analogWrite(BLUE_PIN, data->toBlue());
#endif
}
 
Last edited by a moderator:

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
8,853
Kodun tamamını incelemedim. Şöyle bir üstünden geçtim. Yanlış anlamadıysam eğer bir pompa var ve ledler var. Sıcaklık durumuna göre ledler yanıyor ve pompa çalışıyor.

Bu durumda sistem güzel işliyor olmalı neden ntc ile değiştirmek istiyorsun?

Kod içinde dht kütüphaneleri kaldırılır.
@semih_s in gönderdiği linkten kopya çekerek kendi sistemine NTC yi ekleyebilirsin.
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Program kodu ekleyeceğin zaman editördeki "kod" butonu ile ekle. Hem satır numaralarından bahsedebilirsin hem de program daha anlaşılır olur

1661418360169.png
 

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
Kodun tamamını incelemedim. Şöyle bir üstünden geçtim. Yanlış anlamadıysam eğer bir pompa var ve ledler var. Sıcaklık durumuna göre ledler yanıyor ve pompa çalışıyor.

Bu durumda sistem güzel işliyor olmalı neden ntc ile değiştirmek istiyorsun?

Kod içinde dht kütüphaneleri kaldırılır.
@semih_s in gönderdiği linkten kopya çekerek kendi sistemine NTC yi ekleyebilirsin.
thermistor var elimde sadece o sebeble bu şekilde entegre etmem gerekiyor
 

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
8,853
thermistor var elimde sadece o sebeble bu şekilde entegre etmem gerekiyor
Bence termistör ile tüm yapıyı değiştirmektense dht sensör almak daha mantıklı. Dht sensörlerin 20₺ den başlayan fiyatları var.
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Sıcaklığın okunduğu yer 103 - 107 satırları. Onları kaldırıp celsius değişkenine NTC den elde ettiğin sıcaklığı yazman lazım. Dikkat et, ADC den okuduğun değeri değil, o değere karşılık gelen sıcaklığı.
 

semih_s

Aktif Üye
Katılım
16 Aralık 2020
Mesajlar
641
Bence termistör ile tüm yapıyı değiştirmektense dht sensör almak daha mantıklı. Dht sensörlerin 20₺ den başlayan fiyatları var.
Bence de tek sebep maliyetse dht sensör daha mantıklı. Yada ds18b20 sensörler. Kullanımı kolay palanmaz kılıflı vs...
NTC sensörü tercih edileceği durumlar var, ama isabetli olması için iyi kalibre edilmesi gerekiyor, analog sinyal uzun kabloyla okunacaksa gürültü derdi, güç kaynağı gürültüsü de ayrı dert... Lineerlik de dert, her sıcaklık aralığınıı aynı çözünürlükte ölçemiyorsun.

Beni dertli yaptı bikeresinde bunlar, belli oluyordur :)
 

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
Bence de tek sebep maliyetse dht sensör daha mantıklı. Yada ds18b20 sensörler. Kullanımı kolay palanmaz kılıflı vs...
NTC sensörü tercih edileceği durumlar var, ama isabetli olması için iyi kalibre edilmesi gerekiyor, analog sinyal uzun kabloyla okunacaksa gürültü derdi, güç kaynağı gürültüsü de ayrı dert... Lineerlik de dert, her sıcaklık aralığınıı aynı çözünürlükte ölçemiyorsun.

Beni dertli yaptı bikeresinde bunlar, belli oluyordur :)
benimki biraz farklı hem su içerisinde ölçüm yapacak aslında humidity ihtiyacım olmayacak.. ayrıca kod kısmında verilen sitedeki kodları ekledim ama malesef çalışmadı
 

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
bir destek daha isteyeceğim yardımcı olursanız sevinirim. aşağıdaki kod kısmında io ya connected olduğu zaman kullandığım bir ledin yanıp sönmesini sağlamak istiyorum. nasıl yazabilirz. teşekkürler
Kod:
// wait for a connection
    while (io.status() < AIO_CONNECTED)
    {
        Serial.print(".");
        delay(500);
    }

// we are connected
 

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
8,853
bir destek daha isteyeceğim yardımcı olursanız sevinirim. aşağıdaki kod kısmında io ya connected olduğu zaman kullandığım bir ledin yanıp sönmesini sağlamak istiyorum. nasıl yazabilirz. teşekkürler
Kod:
// wait for a connection
    while (io.status() < AIO_CONNECTED)
    {
        Serial.print(".");
        delay(500);
    }

// we are connected
Bu kodda io bağlı değilse gibi bir durum var sanki. Bunun bir altında "we are connected" yazan yerdeki kodları yapıştırır mısın?
 

Gokrtl

Gökhan Kartal
Staff member
Katılım
27 Şubat 2019
Mesajlar
8,853
ilk entry deki code içerisinde görebilirsiniz.teşekkürler
Şimdi ben telefondan baktığım için ve kodlama alıştığımın dışında olduğu için tam hakim olamıyorum. Ama aşağıdaki çizdiğim yerde io connected olduysa zaten led yakılıyor gibi duruyor. Anladığım kadarıyla bu ledin yanması için "get()" fonksiyonu çağırıyor ama kod içinde get fonksiyonunu bulamadım.

20220826_164825.jpg
 

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
Şimdi ben telefondan baktığım için ve kodlama alıştığımın dışında olduğu için tam hakim olamıyorum. Ama aşağıdaki çizdiğim yerde io connected olduysa zaten led yakılıyor gibi duruyor. Anladığım kadarıyla bu ledin yanması için "get()" fonksiyonu çağırıyor ama kod içinde get fonksiyonunu bulamadım.

18737 eklentisine bak
mqtt üzerinden çalıştırdığı led in son durumunu getiriyor.
 

ozkarah

Aktif Üye
Katılım
4 Ocak 2022
Mesajlar
530
C:
#include "config.h" // ???  kodu yok

#include <AdafruitIO_Feed.h>  // config.h içinde varsa burada gerek yok

//NTC Pin
#define PIN_ANALOG_IN ?? //ADC pinini yazın

// LED Pin
#define LED_2 12


// you should change these to match PWM pins on other platforms.
#define RED_PIN 18
#define GREEN_PIN 19
#define BLUE_PIN 21


// set up the 'temperature' and 'humidity' feeds
AdafruitIO_Feed *temperature = io.feed("Temperature");
AdafruitIO_Feed *humidity = io.feed("Humidity");

// set up the 'led' feed
AdafruitIO_Feed *led = io.feed("1");

// set up the 'pump' feed
AdafruitIO_Feed *pump = io.feed("2");

// set up the 'color' feed
AdafruitIO_Feed *color = io.feed("color");

int x = 0;

void setup()
{

// set LED pin as an output
    pinMode(LED_2, OUTPUT);
    pinMode(PIN_ANALOG_IN, INPUT);

// start the serial connection
    Serial.begin(115200);

// wait for serial monitor to open
    while (!Serial)
        ;


// assign rgb pins to channels
    ledcAttachPin(RED_PIN, 1);
    ledcAttachPin(GREEN_PIN, 2);
    ledcAttachPin(BLUE_PIN, 3);
// init. channels
    ledcSetup(1, 12000, 8);
    ledcSetup(2, 12000, 8);
    ledcSetup(3, 12000, 8);


// connect to io.adafruit.com
    Serial.print("Connecting to Adafruit IO");
    io.connect();

    led->onMessage(handleMessage);
    color->onMessage(handleMessageRGB);

// wait for a connection
    while (io.status() < AIO_CONNECTED)
    {
        Serial.print(".");
        delay(500);
    }

// we are connected
    Serial.println();
    Serial.println(io.statusText());

    led->get();
    color->get();
}

void loop()
{

// io.run(); is required for all sketches.
// it should always be present at the top of your loop
// function. it keeps the client connected to
// io.adafruit.com, and processes any incoming data.
    io.run();

    x++;

    if (x == 102)
    {
        int adcValue = analogRead(PIN_ANALOG_IN);                       // ADC pinini oku
        double voltage = (float)adcValue / 4095.0 * 3.3;                // Voltaj değerini hesapla
        double Rt = 10 * voltage / (3.3 - voltage);                     // NTC direncini hesapla
        double kelvin = 1 / (1 / (273.15 + 25) + log(Rt / 10) / 3950.0); // Kelvin değerini hesapla
        double celsius = tempK - 273.15;                                  // Celcius değerini hesapla
        float fahrenheit = (celsius * 1.8) + 32;                            // Fahrenheit değerini hesapla

        Serial.print("celsius: ");
        Serial.print(celsius);
        Serial.println("C");

        Serial.print("fahrenheit: ");
        Serial.print(fahrenheit);
        Serial.println("F");

// save fahrenheit (or celsius) to Adafruit IO
        temperature->save(celsius);

       
        x = 0;
    }
}

void handleMessage(AdafruitIO_Data *data)
{
    Serial.print("received <- ");

    if (data->toPinLevel() == HIGH)
        Serial.println("HIGH");
    else
        Serial.println("LOW");
    digitalWrite(LED_2, data->toPinLevel());
}
void handleMessageRGB(AdafruitIO_Data *data)
{

// print RGB values and hex value
    Serial.println("Received:");
    Serial.print(" - R: ");
    Serial.println(data->toRed());
    Serial.print(" - G: ");
    Serial.println(data->toGreen());
    Serial.print(" - B: ");
    Serial.println(data->toBlue());
    Serial.print(" - HEX: ");
    Serial.println(data->value());

// invert RGB values for common anode LEDs
    ledcWrite(1, data->toRed());
    ledcWrite(2, data->toGreen());
    ledcWrite(3, data->toBlue());

}

Kabaca yukarıdaki gibi bir şey işinizi görür diye düşünüyorum.
  • NTC bağlantınıza göre hesaplamayı kalibre etmeniz gerekebilir.
  • ESP32 ile kullanacağınız için daha kolay anlayın diye biraz sadeleştirdim.
  • AdafruitIO_Feed kütüphanesi nerede eklenmiş göremedim. config.h içinde ne olduğunu bilmiyoruz, orada olabilir. O yüzden "#include <AdafruitIO_Feed.h>" satırını ekledim.
  • DHT11 ile ilgili yerleri temizledim.
 
Son düzenleme:

ozkarah

Aktif Üye
Katılım
4 Ocak 2022
Mesajlar
530
Şimdi ben telefondan baktığım için ve kodlama alıştığımın dışında olduğu için tam hakim olamıyorum. Ama aşağıdaki çizdiğim yerde io connected olduysa zaten led yakılıyor gibi duruyor. Anladığım kadarıyla bu ledin yanması için "get()" fonksiyonu çağırıyor ama kod içinde get fonksiyonunu bulamadım.

18737 eklentisine bak
@Gokrtl, anladığım kadarıyla;

  • Cihaz Adafruit'in bir bulut servisine bağlı çalışıyor. WiFi ile ilgili ayarların config.h içinde olduğunu tahmin ediyorum.
  • Cihaz bir durum LEDi, bir RGB LED ve bir sensörden oluşuyor.
  • Durumlar (sıcaklı, nem, kırmızı LEDin durumu, RGB ledinin rengi) bulutta saklanıyor, o kodlar buluttaki durumun kırmızı LEDe ve RGB ledine yansıtılmasına yarıyor.
  • Ancak her 102. çevrimde sıcaklık (ve eskiden nem) sensörden okunup buluta gönderiliyor. Oradan da büyük ihtimalle gönderilen sıcaklığa göre kırmızı LEDin durumu ve/veya RGB ledinin rengi ile ilgili bir komut geliyor.
  • Gelen komut io.run() içinde yakalanıyordur. handleMessageXXX fonksiyonlarıyla da gelen komuttaki durum kırmızı LEDe ya da renk RGB LEDe yazılıyor.
 

rubens

Üye
Katılım
25 Ağustos 2022
Mesajlar
21
@Gokrtl, anladığım kadarıyla;

  • Cihaz Adafruit'in bir bulut servisine bağlı çalışıyor. WiFi ile ilgili ayarların config.h içinde olduğunu tahmin ediyorum.
  • Cihaz bir durum LEDi, bir RGB LED ve bir sensörden oluşuyor.
  • Durumlar (sıcaklı, nem, kırmızı LEDin durumu, RGB ledinin rengi) bulutta saklanıyor, o kodlar buluttaki durumun kırmızı LEDe ve RGB ledine yansıtılmasına yarıyor.
  • Ancak her 102. çevrimde sıcaklık (ve eskiden nem) sensörden okunup buluta gönderiliyor. Oradan da büyük ihtimalle gönderilen sıcaklığa göre kırmızı LEDin durumu ve/veya RGB ledinin rengi ile ilgili bir komut geliyor.
  • Gelen komut io.run() içinde yakalanıyordur. handleMessageXXX fonksiyonlarıyla da gelen komuttaki durum kırmızı LEDe ya da renk RGB LEDe yazılıyor.
elinize sağlık hocam.
C:
#include "config.h" // ???  kodu yok

#include <AdafruitIO_Feed.h>  // config.h içinde varsa burada gerek yok

//NTC Pin
#define PIN_ANALOG_IN ?? //ADC pinini yazın

// LED Pin
#define LED_2 12


// you should change these to match PWM pins on other platforms.
#define RED_PIN 18
#define GREEN_PIN 19
#define BLUE_PIN 21


// set up the 'temperature' and 'humidity' feeds
AdafruitIO_Feed *temperature = io.feed("Temperature");
AdafruitIO_Feed *humidity = io.feed("Humidity");

// set up the 'led' feed
AdafruitIO_Feed *led = io.feed("1");

// set up the 'pump' feed
AdafruitIO_Feed *pump = io.feed("2");

// set up the 'color' feed
AdafruitIO_Feed *color = io.feed("color");

int x = 0;

void setup()
{

// set LED pin as an output
    pinMode(LED_2, OUTPUT);
    pinMode(PIN_ANALOG_IN, INPUT);

// start the serial connection
    Serial.begin(115200);

// wait for serial monitor to open
    while (!Serial)
        ;


// assign rgb pins to channels
    ledcAttachPin(RED_PIN, 1);
    ledcAttachPin(GREEN_PIN, 2);
    ledcAttachPin(BLUE_PIN, 3);
// init. channels
    ledcSetup(1, 12000, 8);
    ledcSetup(2, 12000, 8);
    ledcSetup(3, 12000, 8);


// connect to io.adafruit.com
    Serial.print("Connecting to Adafruit IO");
    io.connect();

    led->onMessage(handleMessage);
    color->onMessage(handleMessageRGB);

// wait for a connection
    while (io.status() < AIO_CONNECTED)
    {
        Serial.print(".");
        delay(500);
    }

// we are connected
    Serial.println();
    Serial.println(io.statusText());

    led->get();
    color->get();
}

void loop()
{

// io.run(); is required for all sketches.
// it should always be present at the top of your loop
// function. it keeps the client connected to
// io.adafruit.com, and processes any incoming data.
    io.run();

    x++;

    if (x == 102)
    {
        int adcValue = analogRead(PIN_ANALOG_IN);                       // ADC pinini oku
        double voltage = (float)adcValue / 4095.0 * 3.3;                // Voltaj değerini hesapla
        double Rt = 10 * voltage / (3.3 - voltage);                     // NTC direncini hesapla
        double kelvin = 1 / (1 / (273.15 + 25) + log(Rt / 10) / 3950.0); // Kelvin değerini hesapla
        double celsius = tempK - 273.15;                                  // Celcius değerini hesapla
        float fahrenheit = (celsius * 1.8) + 32;                            // Fahrenheit değerini hesapla

        Serial.print("celsius: ");
        Serial.print(celsius);
        Serial.println("C");

        Serial.print("fahrenheit: ");
        Serial.print(fahrenheit);
        Serial.println("F");

// save fahrenheit (or celsius) to Adafruit IO
        temperature->save(celsius);

      
        x = 0;
    }
}

void handleMessage(AdafruitIO_Data *data)
{
    Serial.print("received <- ");

    if (data->toPinLevel() == HIGH)
        Serial.println("HIGH");
    else
        Serial.println("LOW");
    digitalWrite(LED_2, data->toPinLevel());
}
void handleMessageRGB(AdafruitIO_Data *data)
{

// print RGB values and hex value
    Serial.println("Received:");
    Serial.print(" - R: ");
    Serial.println(data->toRed());
    Serial.print(" - G: ");
    Serial.println(data->toGreen());
    Serial.print(" - B: ");
    Serial.println(data->toBlue());
    Serial.print(" - HEX: ");
    Serial.println(data->value());

// invert RGB values for common anode LEDs
    ledcWrite(1, data->toRed());
    ledcWrite(2, data->toGreen());
    ledcWrite(3, data->toBlue());

}

Kabaca yukarıdaki gibi bir şey işinizi görür diye düşünüyorum.
  • NTC bağlantınıza göre hesaplamayı kalibre etmeniz gerekebilir.
  • ESP32 ile kullanacağınız için daha kolay anlayın diye biraz sadeleştirdim.
  • AdafruitIO_Feed kütüphanesi nerede eklenmiş göremedim. config.h içinde ne olduğunu bilmiyoruz, orada olabilir. O yüzden "#include <AdafruitIO_Feed.h>" satırını ekledim.
  • DHT11 ile ilgili yerleri temizledim.
hocam elinize sağlık ilginiz için çok teşekkürler ancak bir hata aldım.kütüphanelerden dolayı olabilirmi bilmiyorum. heyecanla denedim hemen ama hatayı aşamadım.
'tempK' was not declared in this scope
 
Top