Ошибка в коде. Вывод символов на дисплей.

pashtet440
Offline
Зарегистрирован: 29.12.2016

Доброе время суток заглянувшим. Есть до банальности простой код, а конкретно чать, которая не работает. Хотел сделать стрелочки на дисплее при изменении температуры, которые почему-то статически висят на повышении, хотя должны менять направление при уменьшении температуры например.  В общем в коде определенно есть ошибка, которую  не вижу. Буду благодарен за подсказки. Нужный кусок кода в самом конце, и да, это франкинштейн)

#include <OneWire.h>
#include <LCD_1602_RUS.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <DHT.h>
OneWire  ds(10);  // подключен к 10 пину (резистор на 4.7к обязателен)
DHT dht22(2, DHT22); // Указать датчик DHT11, DHT21, DHT22

LCD_1602_RUS lcd(0x27, 16, 2);   // Задаем адрес и размерность дисплея
void setup(void) {
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
//  byte degree[8] =         // Битовая маска символа градуса
//{
//  B00111,
//  B00101,
//  B00111,
//  B00000,
//  B00000,
//  B00000,
//  B00000,
//};

byte arrow_down[8] = {
 0b00100,
 0b00100,
 0b00100,
 0b00100,
 0b00100,
 0b11111,
 0b01110,
 0b00100
};

byte arrow_up[8] = {
 0b00100,
 0b01110,
 0b11111,
 0b00100,
 0b00100,
 0b00100,
 0b00100,
 0b00100
};

byte X[8] = {
 0b00100,
 0b00100,
 0b00100,
 0b11111,
 0b00100,
 0b00100,
 0b00100,
 0b00100
};

  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
//  lcd.createChar(1, degree);        // Создаем символ под номером 1
  lcd.createChar(2, arrow_up);
  lcd.createChar(3, arrow_down);
  lcd.createChar(4, X);
  }

void loop(void) {
  float dht22_t = dht22.readTemperature(); // чтение датчика на пине 2
  float dht22_h = dht22.readHumidity();    // чтение датчика на пине 2
  float celsius;
  int dht22_past;
  int ds18b20_past = celsius;
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];

   if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // начало коммуникации
  
  delay(1000);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // читаем значение

   for ( i = 0; i < 9; i++) {           // смотрим 9 байтов
    data[i] = ds.read();
   }
  // Преобразуем получненный данные в температуру
  // Используем int16_t тип, т.к. он равен 16 битам
  // даже при компиляции под 32-х битный процессор
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;
  }
  celsius = (float)raw / 16.0;
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Inside");     // Выводим текст
  lcd.setCursor(12, 0);
  lcd.print(dht22_t,1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Outside");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(12, 1);             
  lcd.print(celsius,1);

 if (dht22_t > dht22_past) {
    lcd.setCursor(10,0);
    lcd.write(2);
    }
 else if (dht22_t < dht22_past) {
     lcd.setCursor(10,0);
     lcd.write(3);
    }
 else {
    lcd.setCursor(10,0);
    lcd.write(4);
    }
 if (celsius > ds18b20_past) {
    lcd.setCursor(10,1);
    lcd.write(2);
    }
 else if (celsius < ds18b20_past) {
     lcd.setCursor(10,1);
     lcd.write(3);
    }
 else {
  lcd.setCursor(10,1);
  lcd.write(4);
  }
  dht22_past = dht22_t;
  ds18b20_past = celsius;
  delay(1000);

}

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Для начала вопрос-подсказка : в начале выполнения loop (каждого выполнения), какое значение имеют:dht22_past, ds18b20_past?

Araris
Offline
Зарегистрирован: 09.11.2012

T.Rook, если позволите, подсказка к подсказке : http://arduino.ru/Reference/Static

T.Rook
Offline
Зарегистрирован: 05.03.2016

Araris пишет:

T.Rook, если позволите, подсказка к подсказке : http://arduino.ru/Reference/Static

Не, ну так сразу ответ можно было написать. ТС же просил подсказки! Но, ага, принято.  :)

pashtet440
Offline
Зарегистрирован: 29.12.2016

T.Rook, Araris, спасибо большое за ответы! :) Завтра поковыряю ещё :)

pashtet440
Offline
Зарегистрирован: 29.12.2016

Спасибо большое, ребят, при изменении типа переменной на статик все заработало. :)