Печать доступна с помощью U8GLib

variables oled print u8glib

У меня есть этот код, который берет значения температуры и влажности от датчика DHT11 и количество граней из внешнего кода python и печатает их на OLED-экране, но вместо значений переменных он продолжает печатать 0, как я могу это решить? (К сожалению, некоторые части не на английском языке, но просто рассматривайте их как имена случайных величин.)

//dht11 kodu için ayarlamalar
#include <dht.h>
dht DHT;
#define DHT11_PIN 7

//ekran için ayarlamalar
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
char bufferX [20];
char bufferY [20];
char bufferZ [20];

//fan kodu için ayarlamalar
int mot1 = 8;
int mot2 = 9;
int en1 = 10;
int dir = 6;
bool state = true;
int nob = A0;
int val = 0;
int fan_hizi = 0;
String faces_str;
int faces;
float sicaklik;
float nem;

void draw(void)
{
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 15, bufferX);
  u8g.drawStr( 0, 30, bufferX);
  u8g.drawStr( 0, 45, bufferY);
  u8g.drawStr( 0, 60, bufferZ);
}

void setup() {
  Serial.begin(9600); //iletişim ve dht11 verisi
   
  // pin ayarları
  pinMode(mot1,OUTPUT);
  pinMode(mot2,OUTPUT);
  pinMode(en1,OUTPUT);
  pinMode(dir,INPUT_PULLUP);
}


void loop() {
  //dht11 kodu
  sicaklik = DHT.temperature;
  nem = DHT.humidity;
  delay(1000);


  //iletişim kodu
  if(Serial.available() > 0) {
    faces_str = Serial.readString();
    faces = faces_str.toInt();
  }

  Serial.print(faces);
  
  //sınırlar
  if(faces == 0 && sicaklik < 25 && nem < 65) {
    fan_hizi = 50;
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);
  }
  if(faces >= 1 || sicaklik >= 25 || nem >= 65) {
    fan_hizi = 250;
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
  }

  //ekran
  sprintf(bufferX, "Yuzler: %d", faces);
  sprintf(bufferY, "Sicaklik: %d", sicaklik);
  sprintf(bufferZ, "Nem: %d", nem);
   u8g.firstPage();
  do {
  draw();
    } 
  while ( u8g.nextPage() );
  delay(10);

  //fan kodu
  analogWrite(en1, fan_hizi);
  digitalWrite(mot1, HIGH);
  digitalWrite(mot2, LOW);
  delay(1000);
  digitalWrite(mot1, LOW);
  }

, 👍1

Обсуждение

может быть, он печатает 0, потому что получает 0 ... сделайте некоторую отладку, @jsotola


1 ответ


1

Я не понимаю, как вы инициализируете объект датчика DHT. (Интересно, почему это вообще компилируется?)

Ваш путь:

//dht11 kodu için ayarlamalar
#include <dht.h>
dht DHT;
#define DHT11_PIN 7

Я бы использовал:

//dht11 kodu için ayarlamalar
#include <DHT.h>
#define DHT11_PIN 7

DHT dht( DHT11_PIN, DHT11 );

Не забудьте начать объект DHT с:

void setup() {
  // ... код удален для краткости
  dht.begin();
}

Теперь используйте объект dht instad класса DHT.

sicaklik = dht.readTemperature();
nem = dht.readHumidity();

Вы не указали, какие библиотеки вы использовали. Но я перепробовал все библиотеки DHT, которые смог найти, и ни одна из них не скомпилировалась с вашим кодом без ошибок.

Следующий код компилируется в моей IDE для arduino UNO с установленной библиотекой датчиков olivers ug8lib и adafruits DHT. Кстати: Вы даже не упомянули Arduino/ESP, который вы использовали. Так что я думаю, что это Uno.

//dht11 kodu için ayarlamalar
#include "DHT.h"
#define DHT11_PIN 7
DHT dht( DHT11_PIN, DHT11 );

//ekran için ayarlamalar
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);
char bufferX [20];
char bufferY [20];
char bufferZ [20];

//fan kodu için ayarlamalar
int mot1 = 8;
int m ot2 = 9;
int en1 = 10;
int dir = 6;
bool state = true;
int nob = A0;
int val = 0;
int fan_hizi = 0;
String faces_str;
int faces;
float sicaklik;
float nem;

void draw(void)
{
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 15, bufferX);
  u8g.drawStr( 0, 30, bufferX);
  u8g.drawStr( 0, 45, bufferY);
  u8g.drawStr( 0, 60, bufferZ);
}

void setup() 
{
  Serial.begin(9600); //iletişim ve dht11 verisi
   
  // pin ayarları
  pinMode(mot1,OUTPUT);
  pinMode(mot2,OUTPUT);
  pinMode(en1,OUTPUT);
  pinMode(dir,INPUT_PULLUP);
}


void loop() 
{
  //dht11 kodu
  sicaklik = dht.readTemperature();
  nem = dht.readHumidity();
  delay(1000);

  //iletişim kodu
  if(Serial.available() > 0) 
  {
    faces_str = Serial.readString();
    faces = faces_str.toInt();
  }

  Serial.print(faces);
  
  //sınırlar
  if(faces == 0 && sicaklik < 25 && nem < 65) 
  {
    fan_hizi = 50;
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);
  }
  
  if(faces >= 1 || sicaklik >= 25 || nem >= 65) 
  {
    fan_hizi = 250;
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
  }

  //ekran
  sprintf(bufferX, "Yuzler: %d", faces);
  sprintf(bufferY, "Sicaklik: %d", sicaklik);
  sprintf(bufferZ, "Nem: %d", nem);
  u8g.firstPage();
 
  do 
  {
    draw();
  }  while ( u8g.nextPage() );
  
  delay(10);
 
  //fan kodu
  analogWrite(en1, fan_hizi);
  digitalWrite(mot1, HIGH);
  digitalWrite(mot2, LOW);
  delay(1000);
  digitalWrite(mot1, LOW);
}

У меня нет времени собирать оборудование, чтобы попробовать его. Поэтому я могу сказать, что он компилируется, но не могу сказать, что он работает.

ПРАВКА:

Теперь я нашел adidax "DHT11 lib". ваш код компилируется с помощью этой библиотеки. Но вы забываете считывать значения с датчика, прежде чем считывать их с переменных.

Отсутствует следующая строка:

void loop() {
  //dht11 коду
  DHT.read( DHT11_PIN ); // <-- в этой строке отсутствует
  sicaklik = DHT.temperature;
  nem = DHT.humidity;
...
,

спасибо вам за ваш ответ. я довольно новичок в arduino. да, я использовал плату uno. а насчет dht11 я использовал код, который нашел в Интернете. я не знаю, как именно это работает., @vueenx