Max7219 и десятичная точка

ace
Offline
Зарегистрирован: 17.05.2012

Есть драйвер  индикатора Мах7219 и 3-х цифровой  7 сегментный индикатор.

Небходимо вывести температуру от датчика 18b20 с точностью 1/10.

Пробывал разные варианты но не получается

Подскажите как правильно это сделать 

Програмист я неопытный поэтому желательно с примером

Зараннее спасибо.

#include <OneWire.h> //
#include <DallasTemperature.h>
#include "LedControl.h" // 



LedControl lc=LedControl(12,11,10,1); // 
// pin 12 is connected to the MAX7219 pin 1
// pin 11 is connected to the CLK pin 13
// pin 10 is connected to LOAD pin 12
// 1 as we are only using 1 MAX7219 

OneWire ds(8); 


float T;        //переменная для хранения температуры
int T1;           // переменная текущей температуры


int ones;
int tens;
int hundreds;


void setup()
{
  lc.clearDisplay(0);// clear screen
  lc.shutdown(0,false);// turn off power saving, enables display
  lc.setIntensity(0,7);// sets brightness (0~15 possible values)
  lc.setScanLimit(1, 3);
     
}


void loop()

{
  
    byte data[12]; // массив для хранения принимаемых от датчика данных
    byte i;        
    //работа с 1Wire
    ds.reset();            // любой обмен начинается с импульса reset
    ds.write(0xCC,1);      // т.к. датчик пока один то будем обращаться к нему не по 
                           // адресу, а используя команду "пропуск ROM" (0xCC) 

    ds.write(0x44,1);      // 0x44 - команда на конвертирование температуры
    delay(1000);           // ждем 1 с (время на конвертацию температуры)
    ds.reset();
    ds.write(0xCC,1);      // пропуск ROM
    ds.write(0xBE);        // команда на считывание ОЗУ датчика

    for ( i = 0; i < 9; i++) {           // считываем 9 байт (достаточно 2-х)
      data[i] = ds.read();
    }

    T = float((data[1] << 8) + data[0])/16; //конвертируем 2 байта в десятичное значение температуры
   
    T1 = T*10;
    
    hundreds = T1/100;
           
    tens=(T1-hundreds*100)/10;
    
    ones=T1-(hundreds*100+tens*10);
    
     lc.setDigit(0,0,hundreds,false);
     lc.setDigit(0,1,tens,true);  / сюда и надо      вставить     светящуюся точку во 2 разряде
     lc.setDigit(0,2,ones,false);
     // lc.setDigit(0,1,(tens & '.'),true);
     // lc.setChar(0,1,',',true);
    }




 

Borland
Offline
Зарегистрирован: 17.05.2012

что именно не получается ?

на Serial датчик температуры правильно кажет?

ace
Offline
Зарегистрирован: 17.05.2012

 на сериал показывает точно - но на индикаторах показывает с ошибкой  при нагревании и охлаждении температуру показывает  десятки и десятые нормально а единицы -  четные цифры . Вот такая хрень ...

leshak
Offline
Зарегистрирован: 29.09.2011

 1. А зачем вы сами, руками, читаете датчик, если уже подключили библиотеку DallasTemperature. Она же может эту "грязную работу" сделать за вас.

2. Убедитесь что у вас свежая версия библиотеки. http://milesburton.com/Dallas_Temperature_Control_Library, там же и пример найти можно.

3. В строке 65, выведите в сериал T,hundreds,tens,ones и напишите тут, что видите в Serial (нужно определится что-то неправильно вычисляем или неправильно LCD рулим). И что при этом видите на LCD

ace
Offline
Зарегистрирован: 17.05.2012

 leshak

Спасибо за подсказку!

Все заработало как надо!

Окончательный скетч 

Arduino + 18b20 + max7219 +АЛС318

 #include <LedControl.h>

 #include <OneWire.h>

 #include <DallasTemperature.h>


 LedControl lc=LedControl(12,11,10,1);

 #define ONE_WIRE_BUS 8

 OneWire oneWire(ONE_WIRE_BUS);

 DallasTemperature sensors(&oneWire);

 float T;        //переменная для хранения температуры
 int T1;         // переменная текущей температуры

 int ones;
 int tens;
 int hundreds;

 void setup() 

 {
 lc.clearDisplay(0);// clear screen
 lc.shutdown(0,false);// turn off power saving, enables display
 lc.setIntensity(0,7);// sets brightness (0~15 possible values)
 lc.setScanLimit(1, 3); 
 sensors.begin(); 
 }

 void loop(void)
 { 
 sensors.requestTemperatures(); // Send the command to get temperatures
 T=(sensors.getTempCByIndex(0)); 
 
 T1 = T*10;
	     
 hundreds = T1/100;
	            
 tens=(T1-hundreds*100)/10;
     
 ones=T1-(hundreds*100+tens*10);
     
 lc.setDigit(0,0,hundreds,false);
 lc.setDigit(0,1,tens,true);  
 lc.setDigit(0,2,ones,false);
	     
 }