5110 и 18В20
- Войдите на сайт для отправки комментариев
Вс, 10/01/2016 - 12:30
// ЭТОТ СКЕТЧ КОМПИЛИРУЕТСЯ НО НЕ ПОКАЗЫВАЕТ НА ДИСПЛЕЕ 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?) Вот этот код
Если дисплей работает нормально, то он тут совсем не при чём. Ищите проблему в работе с датчиком, а не в "пролезании его в дисплей".
А если в сериал выводить, то данные "пролазят"?
Вот есть же туториал прям как Вам надо: http://salda.ws/video.php?id=ga_1dqGjsbo
С далласами все в порядке. Они рабочие. Я с ними хорошо знаком. И на мониторе "пролазят" и на обычном LCD1602. Питание пробовал и паразитное и трехпроводное. Менял ардуины. Может в коде засада? я не смог разобраться. Помогите кто может.
Почему зациклился на 5110 ? Потому что мне нужно мониторить температуру в светобоксе на каждой полке отдельно, а потом регулировать включением вентиляторов.
C далласами всё в порядке, с дисплеем тоже. В чём тогда проблема ?
Попробуйте, как уже посоветовали выше, воспользоваться отладочными средствами и вывести температуру в сериал. Если выведется, попробуйте что-нибудь вывести на дисплей, за место температуры.
Так и доберётесь до причины.
52 строку закомментить, вместо нее : float temperature = 3.62; Выведет али нет? Если нет, копайте ваши 53-54 строки.
kriss, ваш скетч кишит косяками. Большими и малыми. Сразу видно, что надёргали из разных источников, и пытаетесь слепить что-то рабочее. Если сверху вниз:
4 стока - зачем грузить библу, если вы её не используете?
21-31 строка -некорректный поиск адреса, вместо адреса будут ноли
57 строка - по возможности никогда не используйте эту команду. Это очень заметно на глаз.
Зато у человека
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); }Спасибо Вам большое!
Ваш скетч сразу заработал. Однако я успел до прочтения вашего, свои косяки поправить. Вот мой код, который тоже заработал! Наверно тоже много лишнего, я методом тыка пробовал закоментировать то, что понятно.
#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(); }всем спасибо!
Вставил в скетч регулятор температуры с гистерезисом. проверил -выполняет задачу.
Подскажите пожалуйста, как организовать ограничение времени включенного состояния, чтобы управлять реверсивным приводом
millis() , или нет ?
Я про эту функцию читал и понял так, что она выводит в последовательный порт время работы
самой платы, но как ее использовать для подсчета времени включения выхода, не знаю.
Ну, всё верно. Вот в это условие и вставляйте весь код, указанный Вами выше. И он не будет выполняться, пока не пройдёт 10 секунд. соответственно, не будет переключений.
PS: Только что у Вас был код в сообщении, зачем удалили его ? Он правильный.
И millis никаким боком не относится к выводу в сериал.
PS: Только что у Вас был код в сообщении, зачем удалили его ? Он правильный.
И millis никаким боком не относится к выводу в сериал.