5110 и 18В20

kriss
Offline
Зарегистрирован: 24.01.2014
 // ЭТОТ СКЕТЧ КОМПИЛИРУЕТСЯ НО   НЕ ПОКАЗЫВАЕТ НА ДИСПЛЕЕ 5110 ТЕМПЕРАТУРУ ОТ 18В20
#include <OneWire.h>

#include <DallasTemperature.h>
#include <LCD5110_Basic.h>

LCD5110 myGLCD(3,4,5,7,6);
OneWire  ds(10);

extern uint8_t MediumNumbers[];


void setup()
{
  myGLCD.InitLCD();
}

void loop(){

  byte data[12];
  byte addr[8];

  if (!ds.search(addr)) {
    Serial.println("No more addresses.");
    return;
  }
   ds.reset_search(); //      должен искать,   не мигают  Rx, Tx????   или  не так считаю?
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      delay(1000);
      return;
  }
   
  ds.select(addr);    
 
  ds.write(0x44);   //0x44  провести измерение температуры и записать данные в оперативную память
  delay(1000);

  ds.reset();  // должен искать, но  ведь не мигают  Rx, Tx
  ds.select(addr);
  ds.write(0xBE);    //   0xBE – считать последовательно 9 байт оперативной памяти  0xB4 – вернет тип питания (0 – паразитное, 1 – внешнее)

  for (int i = 0; i < 9; i++) {       
    data[i] = ds.read();
  }

  int raw = (data[1] << 8) | data[0];

  // Переводим в температуру

  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
  float temperature = raw / 16.0;
    myGLCD.setFont(MediumNumbers);
    myGLCD.printNumF(temperature, 2, CENTER, 0);
    delay(100);
 
  myGLCD.clrScr();
}
 

Помогите разобраться что упустил. Скетч компилируется, ошибок не выдается. Но термометр не работает. Дисплей 5110 прекрасно работает, все тесты проходит и символьные и графические. С ДНТ-11 тоже работает. А вот далласы 18В20 никак не пролазят на его экран. Компиляция проходит сразу. Подключение датчика пробовал на разных входах. Обратил внимание -не моргаютТх (или это только при serial?) Вот этот код

Alexino
Offline
Зарегистрирован: 29.12.2015

Если дисплей работает нормально, то он тут совсем не при чём. Ищите проблему в работе с датчиком, а не в "пролезании его в дисплей".

Алексей Н
Offline
Зарегистрирован: 02.01.2016

А если в сериал выводить, то данные "пролазят"?

Вот есть же туториал прям как Вам надо: http://salda.ws/video.php?id=ga_1dqGjsbo

kriss
Offline
Зарегистрирован: 24.01.2014

С далласами все в порядке. Они рабочие. Я с ними хорошо знаком. И на мониторе "пролазят" и на  обычном LCD1602.                    Питание пробовал и паразитное и трехпроводное. Менял ардуины. Может в коде засада? я не смог разобраться. Помогите кто может.

Почему зациклился на 5110 ?  Потому что  мне нужно мониторить температуру в светобоксе на каждой полке отдельно, а потом регулировать включением вентиляторов.  

 

Alexino
Offline
Зарегистрирован: 29.12.2015

C далласами всё в порядке, с дисплеем тоже. В чём тогда проблема ? 
Попробуйте, как уже посоветовали выше, воспользоваться отладочными средствами и вывести температуру в сериал. Если выведется, попробуйте что-нибудь вывести на дисплей, за место температуры. 
Так и доберётесь до причины.

bwn
Offline
Зарегистрирован: 25.08.2014

52 строку закомментить, вместо нее : float temperature = 3.62; Выведет али нет? Если нет, копайте ваши 53-54 строки.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kriss, ваш скетч кишит косяками. Большими и малыми. Сразу видно, что надёргали из разных источников, и пытаетесь слепить что-то рабочее. Если сверху вниз:

4 стока - зачем грузить библу, если вы её не используете?

21-31 строка -некорректный поиск адреса, вместо адреса  будут ноли

57 строка - по возможности никогда не используйте эту команду. Это очень заметно на глаз.

Alexino
Offline
Зарегистрирован: 29.12.2015

Зато у человека

kriss пишет:
С далласами все в порядке. Они рабочие. Я с ними хорошо знаком. И на мониторе "пролазят" и на  обычном LCD1602.  
:)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kriss, вот исправил :

#include <OneWire.h>
#include <LCD5110_Basic.h>
LCD5110 myGLCD(3,4,5,6,7);
OneWire  ds(10);
extern uint8_t MediumNumbers[];
void setup(){
myGLCD.InitLCD();
}

void loop(){
  byte addr[8];
if ( !ds.search(addr)) { ds.reset_search(); }
   ds.reset();
   ds.select(addr);    
   ds.write(0x44);   //0x44  провести измерение температуры и записать данные в оперативную память
 delay(1000);
  ds.reset();  // 
  ds.select(addr);
  ds.write(0xBE);    //  
  float temperature =  (ds.read() | (ds.read()<<8)) / 16.0  ;
   myGLCD.setFont(MediumNumbers);
   myGLCD.printNumF(temperature, 2, CENTER, 0);
 }
 

 

kriss
Offline
Зарегистрирован: 24.01.2014

Спасибо Вам большое!

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

 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LCD5110_Basic.h>
LCD5110 myGLCD(3,4,5,6,7);
OneWire  ds(8); 
extern uint8_t BigNumbers[];  //
extern uint8_t SmallFont[];  //

void setup()
{
  myGLCD.InitLCD();
}

void loop(){
  
  byte data[12];
  byte addr[8];  
 
  if (!ds.search(addr)) {
    Serial.println("No more addresses."); 
    return;
  }
    ds.reset_search(); //поиск нового устр в сети

ds.reset();   // сброс шины перед связью с датчиком     
  ds.select(addr);   //выбор устройства после сброса, передается ROM Код устройства.
     
  ds.write(0x44);   //0x44  провести измерение температуры и записать данные в оперативную память  
  delay(10);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);    //   0xBE – считать последовательно 9 байт оперативной памяти  0xB4 – вернет тип питания (0 – паразитное, 1 – внешнее) 
//без ds.write(0xBE) -показывает -0,6
  for (int i = 0; i < 9; i++) {           
    data[i] = ds.read();  
  }
  int raw = (data[1] << 8) | data[0];  
//Переводим в температуру   

  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  float temperature = raw / 16.0;
 
    myGLCD.setFont(BigNumbers);
    myGLCD.printNumF(temperature, 2, CENTER, 0);
    
  myGLCD.setFont(SmallFont);
  myGLCD.print("PETUNIA", CENTER, 40);  //название рассадной полки  
    delay(5000);
     
  myGLCD.clrScr();
}

   

kriss
Offline
Зарегистрирован: 24.01.2014

всем спасибо! 

 

kriss
Offline
Зарегистрирован: 24.01.2014

Вставил в скетч регулятор температуры с гистерезисом. проверил -выполняет задачу.

 float temperature =  (ds.read() | (ds.read()<<8)) / 16.0  ;
  if (temperature >26)  {
    digitalWrite(OUT, 1); //включаю нагрузку     
  } 
  else if (temperature < 25) {                   
    digitalWrite(OUT, 0);     //выключаю  }   

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

 

 

Alexino
Offline
Зарегистрирован: 29.12.2015

millis() , или нет ? 

kriss
Offline
Зарегистрирован: 24.01.2014

    Я про эту функцию читал и понял так,  что она   выводит в последовательный порт время работы  

самой платы, но как ее использовать для подсчета времени включения выхода, не знаю.   

Alexino
Offline
Зарегистрирован: 29.12.2015

Ну, всё верно. Вот в это условие и вставляйте весь код, указанный Вами выше. И он не будет выполняться, пока не пройдёт 10 секунд. соответственно, не будет переключений.

Alexino
Offline
Зарегистрирован: 29.12.2015

PS: Только что у Вас был код в сообщении, зачем удалили его ? Он правильный.

И millis никаким боком не относится к выводу в сериал.

kriss
Offline
Зарегистрирован: 24.01.2014

Alexino пишет:

PS: Только что у Вас был код в сообщении, зачем удалили его ? Он правильный.

И millis никаким боком не относится к выводу в сериал.

 Я удалил т.к. подумал что в результате получил просто задержку программы на 10с.  я ведь не владею программированием.      спасибо за поддержку -  теперь буду  экспериментировать дальше.  Мне проще за это время спаять таймер на двух транзисторах, но это  теперь не в моде