Необходимо вывести температуру DS18B20 и положение РЕЛЕ на TFT 2.4 дисплей (ХЕЛП)
- Войдите на сайт для отправки комментариев
Пт, 18/03/2016 - 03:49
#include <OneWire.h>
OneWire ds(10); // подключен к 10 пину (резистор на 4.7к обязателен)
void setup(void) {
Serial.begin(9600);
pinMode(3, OUTPUT);
// ВКЛ насос
digitalWrite(13, HIGH);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // начало коммуникации
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // читаем значение
Serial.print(" Data = ");
Serial.print(present, HEX);
Serial.print(" ");
for ( i = 0; i < 9; i++) { // смотрим 9 байтов
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(" ");
}
Serial.print(" CRC=");
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();
// Преобразуем получненный данные в температуру
// Используем 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;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
// Если температура достигает температуры кипения (с погрешностью), отключаем кипятильник
if (celsius > 40)
{
digitalWrite(13, LOW);
}
if (celsius < 40)
{ digitalWrite(13, HIGH);
}
}
Изучаете ваш дисплей, учитесь выводить на него значение переменных, выводите значение celsius и состояние 13 пина. Все.
Спасибо , разобрался !
Но, осталась проблемка с затиранием старых значений температуры ! т.е налаживаются по верх старых....
Полностью дисплей обновлять функцией tft.fillScreen(BLACK); не вариант (((( Может есть вариант , просто обновить участок ?
Код сырой программы (TFT+ds18b20)
Молодец! На LCD просто печатают в нужные знакоместа пробелы.
Не совсем понял о чем вы говорите !
По моему вопрос был как избежать накладывания значений старых температур и новых !?
Не совсем понял о чем вы говорите !
По моему вопрос был как избежать накладывания значений старых температур и новых !?
У меня tft не было, может отличаться. На lcd подобную проблему решают методом вывода пробелов, а потом печати новых значений на эти места.
В том то и проблемма испробовал уже 2 разных метода ... результат тот же (((
Спасибо !
То есть конструкция вида
не срабатывает ??
Так не сработает. В tft.setTextColor(color1, color2) задай два аргумента: первый цвет текста, второй цвет фона. Если вызвать с одним аргументом, то фон прозрачный и текст накладывается на предыдущий
Проверить не на чем, но уверен, что Вы абсолютно правы. Тогда примерно так
Огроменное спасибо Araris и Julian Gardna.... Все работает в точности как написали ....
Я то не учь не допер , сразу ....
Я сам не допер сразу. Ни в одном примере этого нет, на форуме нашел.
=) Сейчас бы еще нормально русифицировать это дело , последняя задача.
Я библиотеками от адафрута пользуюсь и SWTFT как драйвер дисплея. Там с кирилицей все нормально. Смотри примеры к SWTFT.
Это да, спасибо ! Тут разобрался без труда , случайно нет ли описаниля библиотеки для тач-скрина ....
Идея в том что бы создать несколько подменю и добавить возможность менять уставки с дисплея ....
Вот и загвоздочка, с ЕЕРОМ разобрался , а вот вывести все это на отдельную подменюшку никак .
dovgiy_nikolay, пожалуйста! С тачскрином я сам не разобрался, к сожалению, меню для меня мрак полный. Мое одноранговое меню на диплей 1602 заняло 80% программной и 60% оперативной памяти на Ардуино Уно, подменю даже не рассматривал тогда. Так что сам с удовольствием почитаю на эту тему.
Я библиотеками от адафрута пользуюсь и SWTFT как драйвер дисплея. Там с кирилицей все нормально. Смотри примеры к SWTFT.
А интересно было бы посмотреть начало Вашей программы до секции "void loop()"
Я когда искал библиотеку для своего 2.4", "SWIFT" тоже пытался использовать, но ничего не получилось с такой ошибкой:
Что подключено :
1) Три датчика ds18b20
* На 11й пин ардуино
2) Реле
* Пока одна релюха подлючена к 13 пину
Как результат выполнения скетча .... Увы пока без коментариев , дорабатываю меню .
И да, внутри используется доп библлиотека для рус языка (utf8rus)
ссылка на библиотеку и рус шрифт :
https://drive.google.com/open?id=0B5CI0lkASPtvQXFiUEN6QWF1MXM
Красиво! Но я бы лично еще и цифры в ряд выстроил у правой стороны, наряду с "Отоплением" и каждую строчку взял бы в красивую рамочку как "Положение двигателя" . А почему именно "положение", а не "состояние"? И почему "Двигатель"? Я так понял у тебя над котлом стоит маленькая турбинка, которая гоняет по системе воду, помогает конвекции. Так этот насос как-то называется... не помню. У нас его называют "Турбина" ))))))
И - ага! SWIFT у тебя-таки тоже не пошёл судя из того что ты заюзал Adafruit_TFTLCD.h Значит дело не в компе или ХР... Спасибо.
Buzzer2010, я сейчас сам решил проверить, и у меня не откомпилировался работающий ранее код. На версии 1.5 кажется работало, а теперь
А сам код вот он
dovgiy_nikolay, Ваша ссылка на библиотеку просит регистрации:
Требуется разрешение
Хотите просмотреть файл? Свяжитесь с его владельцем или войдите в аккаунт с правом доступа. Подробнее…
Поправьте, пожалуйста! Мне бы пригодились рабочие библиотеки для этого дисплея.
Рабочие библиотеки лежат на гитхабе и у Вас тоже, думаю, лежали или до сих пор лежат. Там дело не в библиотеке, а в способе инициализации дисплея.
Если у Вас такой же китайский шилд как у меня - с SD-ридерм и тачем, то тогда вот как надо запускать этот дисплей:
И дальше уже выводите на экран то что хотели... Всё!
Buzzer2010, спасибо, но не получилось. Та жеошибка SWTFT.cpp:634:16: error: 'swap' was not declared in this scope, т.е. переменная в библиотеке не объявлена (а как тогда на предыдущих версиях компилировалось?). А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.
Buzzer2010, спасибо, но не получилось. Та жеошибка SWTFT.cpp:634:16: error: 'swap' was not declared in this scope, т.е. переменная в библиотеке не объявлена (а как тогда на предыдущих версиях компилировалось?). А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.
А причем тут вообще "SWIFT" ? Вы же видели что в тексте программы, автор уже не использует эту библиотеку и даже перешёл на руссифицированый шрифт от "Adafruit" !
Поменяйте начало программы, что касается графики, на вот такие строки:
И только тогда - пробуйте!
https://drive.google.com/file/d/0B5CI0lkASPtvQXFiUEN6QWF1MXM/view?usp=sh...
Ну как я и писал ниже что проэкт еще дорабатывать буду ...
и ДА, у меня эта библиотека тоже не пошла . Надоело ковырятся , просто заменил на рабоую .
Впереди еще меню есть , так что сейчас просто задачу решил с организацией вывода данных ...
Теперь пытаюсь разобратся как написать меню и прочертить тренды .
https://drive.google.com/file/d/0B5CI0lkASPtvQXFiUEN6QWF1MXM/view?usp=sh...
А как, если не секрет, Вы прицепили три датчика к одной ноге ардуино?
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire)
void
setup
()
25
{
30
sensors.begin();// Инициализация сенсоров
31
}
void
loop
(){
33
34
sensors.requestTemperatures();
35
36
tft.setCursor(0, 30);
37
tft.setTextColor(YELLOW,BLACK);
38
tft.setTextSize(3);
39
tft.print(utf8rus(
"ОТОПЛЕНИЕ C -> "
));
40
tft.print(sensors.getTempCByIndex(1),0);Вывод сенсоров на ТФТ дисплей
41
42
tft.setCursor(0, 60);
43
tft.setTextColor(YELLOW,BLACK);
44
tft.setTextSize(3);
45
tft.print(utf8rus(
"КОТЕЛ C -> "
));
46
tft.print(sensors.getTempCByIndex(3),0);
Вывод сенсоров на ТФТ дисплей
67
tft.setCursor(0, 90);
68
tft.setTextSize(3);
69
tft.setTextColor(YELLOW,BLACK);
70
tft.print(utf8rus(
"ДОМ C -> "
));
71
tft.print(sensors.getTempCByIndex(0),0);
Можно задать чтение через ИД сенсора , но я подумал и счел это глупой идеей ... Так как можно использовать это
sensors.getTempCByIndex .... Как подлючил механически смотрите фото ниже .
Где ножки садим ваши датчики .
Красный --- +
Оранжевый --- Сигнал
Черный --- Минус .
Перемычка между Оранжевым и Красным это резистор 4.7 кОМ
Но у меня получилось 4.9 , так как на работе небыло подходяшего , пришлось паять кишку .
А если можно - схематически )))
Но у меня получилось 4.9 , так как на работе небыло подходяшего , пришлось паять кишку .
Резистор от 2К до 10К, чем меньше, тем сильнее нагружен пин, но и меньше шанс на помехи.
ну при 3.9К херню на выходе получал )))
Чет непонятное происходило с датчиком )
Спасибо за подсказку, на метиостание проверю как буду лепить ее )
Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...
СПАСИБО!
Смотри выше .... бы можешь и 10 поставить .... не суть )))
Смотри выше .... бы можешь и 10 поставить .... не суть )))
Да ладно! О.о Так зачем тогда выдумали ардуины меги с 54-мя выводами или сколько там их у нее.. ))))
неее, ну я образно говоря ))) Не совсеми шылдами прокатит такой фокус )))
А интересно можно ли зацепить на эту "плату расширения" датчик температуры и фоторезистор например?
Не, с температурными датчиками это очень удачная идея как раз, потому что я уже стал гадать куда бы мне приделать эту ардуину, а то программирование программированием, а практического применения - ноль. А вот, кстати, очень было бы полезно приделть пару датчиков к моему автомобилю. Например для управления воздушной заслонкой карбюратора, а то "местная" автоматика не выдерживает никакой критики уже. Только я слышал что в автомобиле жуткие помехи по питанию идут и надо с этим как-то бороться.
Незнаю правельно ли я понял , но как я понял эту строку !
после *реквестет сенсор* идет sensors.getTempCByIndex (0) это и будет твой первый датчик !
т.е он якобы читает подряд все что приходит на вход 11пина и сортирует сам т.д по адресам
ток как эта хрень происходит для меня пока тоже мрак !
Т.е сканирует все - сравнение адресов - вывод по индексам !
sensors.getTempCByIndex (0)
sensors.getTempCByIndex (1)
sensors.getTempCByIndex (3)
и т.д
Дальше нюансы библиотеки , туда я не лез )
Все что могу сказать .... Я пили этот код
Тогда есть только дин способ - практический )))) Ждём тогда когда ты установишь всю эту конструкцию на свой котёл и что будет )))
Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...
СПАСИБО!
Простенько
Схема работает , лампочки 220в 100ват подлючал через реле ))) Включаются и тухнут по достижению температуры .... мне то что, только насос переключать ) Не ракеты запускать из дому =D
Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...
СПАСИБО!
Простенько
Незнаю правельно ли я понял , но как я понял эту строку !
после *реквестет сенсор* идет sensors.getTempCByIndex (0) это и будет твой первый датчик !
т.е он якобы читает подряд все что приходит на вход 11пина и сортирует сам т.д по адресам
ток как эта хрень происходит для меня пока тоже мрак !
Т.е сканирует все - сравнение адресов - вывод по индексам !
sensors.getTempCByIndex (0)
sensors.getTempCByIndex (1)
sensors.getTempCByIndex (3)
и т.д
Дальше нюансы библиотеки , туда я не лез )
Вот где собака порылась:
Да , спасибо за заметку)))
.... А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.
А можно поинтересоваться - как Вы определили какой чип на вашем дисплее? Очень актуально!
С помощью этого скетча читаем ID контроллера, далее ищем в гугле
код моего 0x7783, этот же код нужно писать при инициализации дислея.
Так не сработает. В tft.setTextColor(color1, color2) задай два аргумента: первый цвет текста, второй цвет фона. Если вызвать с одним аргументом, то фон прозрачный и текст накладывается на предыдущий
Спасибо Вам за Ваш пост. Долго я искал как решить вывод значений с датчиков на экран.