Как разобрать на части показания датчика DS18B20

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Показания с часиков на модуле DS1307 разбираю на части без проблем 

#include <DS1307.h>
#include <LiquidCrystal.h>

DS1307 rtc(A4, A5);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int asd=0;

void setup()
{
  lcd.begin(16, 2);
  rtc.halt(false);
}

void loop()
{
  
  lcd.setCursor(1,0);
  lcd.print(rtc.getTimeStr());
  
  String stringOne = rtc.getTimeStr();
  
   asd = stringOne.substring(6,7).toInt();

   
  lcd.setCursor(1,1);
  lcd.print(asd); 
 
}

А вот никак не могу разобрать показания датчика температуры DS18B20

Простой скетч для разборки

#include <OneWire.h>
OneWire  ds(7);

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2); 
}

void loop()
{

 byte data[2];
 ds.reset(); 
 ds.write(0xCC);
 ds.write(0x44);
 ds.reset();
 ds.write(0xCC);
 ds.write(0xBE);
 data[0] = ds.read(); 
 data[1] = ds.read();
 int Temp = (data[1]<<8)+data[0];
 int f = round(Temp*9.0/5.0 + 32.0);
 Temp = Temp>>4;
 
 lcd.setCursor(0,0);
 lcd.print(Temp);
}
inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Пробовал так  

 String stringOne = Temp;
  
 asd = stringOne.substring(0,1).toInt();

но ругается 

sketch_oct13b.ino: In function 'void loop()':
sketch_oct13b:33: error: invalid conversion from 'int' to 'const char*'
sketch_oct13b:33: error: initializing argument 1 of 'String::String(const char*)'
 
Тренбуется при температуре 27 градусов  , получить два числовых значения 2 и 7 для отображения на индикаторе....
 
axill
Offline
Зарегистрирован: 05.09.2011

если я правильно понял, что вам нужно:

uint8_t digit0 = temp /10;
uint8_t digit1 = temp % 10;

 

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Спасибо большое , помню где то читал на форуме, но не смог найти --- все работает...

 

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

А как разобрать частоту ???

#include <Wire.h>
 
unsigned char frequencyH = 0;
unsigned char frequencyL = 0;
 
unsigned int frequencyB;
double frequency = 0;
 
void setup()
{
  Wire.begin();
  frequency = 87.5; //starting frequency
  setFrequency();
  Serial.begin(9600);
}
 
void loop()
{
  int reading = 868;
  //frequency = map((float)reading, 0.0, 1024.0, 87.5, 108.0);
 
  frequency = ((double)reading * (108.0 - 87.5)) / 1024.0 + 87.5;
  frequency = ((int)(frequency * 10)) / 10.0;
 
  setFrequency();
  Serial.println(frequency);
}
 
void setFrequency()
{
  frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
  frequencyH = frequencyB >> 8;
  frequencyL = frequencyB & 0XFF;
  delay(100);
  Wire.beginTransmission(0x60);
  Wire.write(frequencyH);
  Wire.write(frequencyL);
  Wire.write(0xB0);
  Wire.write(0x10);
  Wire.write((byte)0x00);
  Wire.endTransmission();
  delay(100);  
}

Изначально приемник настроен на частоту 104.8

 int reading = 868;

Как разобрать на части frequency, которая отображает в мониторе порта 104.80

Заранее спасибо за помощь ...

axill
Offline
Зарегистрирован: 05.09.2011

точно так же - комбинация деления и операции %, например цифру обозначающую сотни:

uint8_t digit100 = (frequency / 100) % 10;

для десятых и сотых долей можно frequency преобразовать в целоче число, умножим перед этим на 100 - тогда у вас все цифры сдвинуться и в нулевом разряде будут сотые доли, в первом - десятые и т.е. и далее кобинируя деление и % выделите цифру любого разряда

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Пробовал так 

String stringOne = frequency;
 
asd = stringOne.substring(0,1).toInt();

Ошибка 

FM_tea5767.ino: In function 'void setFrequency()':
FM_tea5767:46: error: conversion from 'double' to non-scalar type 'String' requested
 
Пробую так 
 
uint8_t digit0 =frequency /10;
uint8_t digit1 =frequency % 10;

Строка

 uint8_t digit0 =frequency /10;

отображает 10 ( но работает когда убрать строку " uint8_t digit1 =frequency % 10;" )

Когда указана строка  

uint8_t digit1 =frequency % 10;

 ругается

FM_tea5767.ino: In function 'void loop()':

FM_tea5767:30: error: invalid operands of types 'double' and 'int' to binary 'operator%'
 

 

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Умножил частоту на 104,8 на 10  и получил 1048... А потом разобрал на части как указано выше !!! Всем спасибо !!!

axill
Offline
Зарегистрирован: 05.09.2011

мои примеры для целочисленных типов данных. У вас дисплей какой? Так возиться с цифрами имеет смысл только для семисегментных индикаторов, которые текст не понимают. Для дисплеев понимающих текст проще использовать форматирование, исопльзуя например sprintf:

char buf[8];
sprintf(buf, "%2.0f", temperature);

давно не использовал форматирование чисел с плавающей точкой, но вроде так. Тоже можно для частоты использовать. только формат должен быть "%3.2f".

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

У меня дисплей 1602, но я там отображаю символи в таком формате, потому и требуется разбор на части...

пока только отображается время, а я хочу добавить отображение температуры и частоты на какой работает радио, --- управление с IR пульта...  

Что -то наподобии радиобудильника )))

А тут видео работы на дисплее С242-08D

http://youtu.be/PXjy2RxKfqM

toc
Offline
Зарегистрирован: 09.02.2013

inhelp, красивые часы. :)

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Через 2 - 3 дня опубликую полностью проэкт "Радиобудильник с датчиком температуры" .

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

Приятно, когда толковые люди публикуют толковые проекты, а не длинные списки "хотелок"...

Ждем-с.

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Пока тестирую и исправляю ошибки...

Видео http://www.youtube.com/watch?v=jl8MyHcIffY

Все спасибо за помощь...

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

Класс! Для полного счастья не хватает, пожалуй, регулировки яркости подсветки, но это уже мелочь.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Зачётно !!!