ребят помогите пожалуйста. скетч компилируется нормально. но на дисплей почему то выдает температуру 401-415 градусов
- Войдите на сайт для отправки комментариев
Ср, 17/01/2018 - 01:04
#include <LiquidCrystal.h>
#include <DallasTemperature.h>
LiquidCrystal lcd(7,6,5,4,3,2);
DallasTemperature sensors;
int tempPin = 9; // выход ds18b20
int fan = 11; // вывод на вентилятор
int led = 8; // вывод на светодиод
int temp;
int tempMin = 30; // температура начала вращения вентилятора
int tempMax = 70; // максимальная температура, когда вентилятор вращается на 100%
int fanSpeed;
int fanLCD;
void setup() {
pinMode(fan, OUTPUT);
pinMode(led, OUTPUT);
pinMode(tempPin, INPUT);
lcd.begin(16,2);
}
float temperature() { // Измеряем температуру 10 секунд
delay(100); // Задержка перед первым измерением
sensors.requestTemperatures(); // Запрос на измерение температуры (1-й ошибочный)
delay(500); // Задержка перед поторным измерением
sensors.requestTemperatures(); // Запрос на измерение температуры (повторный)
float t = float(sensors.getTempCByIndex(0)); // Получаем значение температуры
delay(9400); // Задержка, чтобы датчик не нагревался от частых измерений
return(t);
}
void loop() {
temp = readTemp(); // получаем температуру
if(temp < tempMin) { // если temp меньше минимума
fanSpeed = 0; // кулер не вращается
digitalWrite(fan, LOW);
}
if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума
fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора
fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD
analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed
}
if(temp > tempMax) { // если temp больше максимума
digitalWrite(led, HIGH); // включаем светодиод
} else { // иначе выключаем светодиод
digitalWrite(led, LOW);
}
lcd.print("TEMP: ");
lcd.print(temp); // отображение температуры
lcd.print("C ");
lcd.setCursor(0,1); // перевод курсора на следующую сторку
lcd.print("FANS: ");
lcd.print(fanLCD); // отображение скорости вращения вентилятора
lcd.print("%");
delay(200);
lcd.clear();
}
int readTemp() { // получить температуру и переконвертировать ее в цельсии
temp = analogRead(tempPin);
return temp;
}
сейчас отключил датчик температуры, а он все равно показывает 401-415 градусов. где то я забыл подружить датчик температуры с дисплеем
В строке 20 Вы определли функцию "
floattemperature()" но потом нигде и ни разу её не используете!Вы считаете, что температуру у Вас читает функция "
intreadTemp()" (строка 56), но она никак (от слова совсем) не использует Ваш температурный датчик, объявленный в строке 4 - вообще никак не использует.Вот и и думайте
1. Зачем Вам температурнй датчик, который Вы не используете?
2. Зачем Вам функция, которая ни разу не вызывается.
Спасибо Женя. Сейчас попробую исправить.
Нестыковка тут:
int tempPin = 9; // выход ds18b20
temp = analogRead(tempPin);
У вас датчик Даллас или что-то аналоговое?
даллас , я тоже об этом думаю. мне кажется где то здесь ошибка
мне кажется где то здесь ошибка
Эта фраза - лучшая за сегодняшний вечер :) :) :)
Хоть кому то настроение поднял))))
можно и лайк поставить))
вообще вот мой скетч который я доработал
#include <Wire.h> // Подключаем библиотеку Wire #include <LiquidCrystal.h> // Подключаем библиотеку LiquidCrystal_I2C #include <DallasTemperature.h> // Подключаем библиотеку DallasTempature #define DS18B20 9 // Указываем, к какому выводу подключена DQ byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса LiquidCrystal lcd(7,6,5,4,3,2); // Задаем адрес и размер дисплея OneWire oneWire(DS18B20); DallasTemperature sensors(&oneWire); void setup() { sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("TEMP"); // Выводим текст } void loop() { lcd.createChar(1, simvol); // Создаем символ под номером 1 sensors.requestTemperatures(); // Считываем показания температуры lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(sensors.getTempCByIndex(0)); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.print("\1"); // Выводим символ градуса lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст }он отлично работает. но как только я начинаю работать с вентилятором то начинается трындец. может подскажете. как правильно добавить вентилятор в скетч. чтобы можно было контролировать обороты
что то типа такого
................
} if(temp < tempMin) { // если temp меньше минимума fanSpeed = 0; // кулер не вращается digitalWrite(fan, LOW); } if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed } digitalWrite(led, HIGH); // включаем светодиод } else { // иначе выключаем светодиод digitalWrite(led, LOW); }это отрывок из скетча который я нашел в инете
грубо говоря было три скетча
1. датчик температур
2. дисплей 1602
3. вентилятор.
первые 2 я успешно объеденил а вот третий добавить не получается
Дальше - у вас уже есть кусок кода, который оперирует с tempC. Создайте только переменные tempMin и tempMax, в которые запишите максимальную и минимальную температуры.
но у меня в 9 и 10 строке уже есть определенные минимум и максимум разве это не должно работать?
у меня ds18b20 подключенный к 9 пину. он не аналоговый. значит мне надо удалить строку temp = analogRead(tempPin); и заменить на 9 пин ??? как это должно выглядеть?
Пробуй. Я не компилировал, главное, чтобы ты понял, что к чему:
#include <Wire.h> // Подключаем библиотеку Wire #include <LiquidCrystal.h> // Подключаем библиотеку LiquidCrystal_I2C #include <DallasTemperature.h> // Подключаем библиотеку DallasTempature #define DS18B20 9 // Указываем, к какому выводу подключена DQ byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса LiquidCrystal lcd(7,6,5,4,3,2); // Задаем адрес и размер дисплея OneWire oneWire(DS18B20); DallasTemperature sensors(&oneWire); int temp; int tempMin = 30; // температура начала вращения вентилятора int tempMax = 70; // максимальная температура, когда вентилятор вращается на 100% int fan = 11; // вывод на вентилятор int fanSpeed; int fanLCD; void setup() { sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("TEMP"); // Выводим текст } void loop() { lcd.createChar(1, simvol); // Создаем символ под номером 1 sensors.requestTemperatures(); // Считываем показания температуры lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 temp = sensors.getTempCByIndex(0); lcd.print(temp); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.print("\1"); // Выводим символ градуса lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст if(temp < tempMin) { // если temp меньше минимума fanSpeed = 0; // кулер не вращается digitalWrite(fan, LOW); } else if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed } }РЕБЯТ, КОРОЧЕ, ЕСЛИ СМОЖЕМ В БЛИЖАЙШЕЕ ВРЕМЯ ВОТ К ЭТОМУ СКЕТЧУ ДОБАВИТЬ КОМАНДЫ ВЕНТИЛЯТОРУ ,ЧТОБЫ ОН ПРИ 36 ГРАДУСАХ НАЧИНАЛ КРУТИТЬСЯ И ЗАГОРАЛСЯ ДИОД, А ПРИ 38 МАКСИМАЛЬНО ВРАЩАЛСЯ, Я В ДОЛГУ НЕ ОСТАНУСЬ. ЕСЛИ НАДО Я ОТБЛАГОДАРЮ ПО-ЧЕЛОВЕЧЕСКИ. МНЕ НЕ ЖАЛКО .ЧЕСТНОЕ СЛОВО
#include <Wire.h> // Подключаем библиотеку Wire #include <LiquidCrystal.h> // Подключаем библиотеку LiquidCrystal_I2C #include <DallasTemperature.h> // Подключаем библиотеку DallasTempature #define DS18B20 9 // Указываем, к какому выводу подключена DQ byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса LiquidCrystal lcd(7,6,5,4,3,2); // Задаем адрес и размер дисплея OneWire oneWire(DS18B20); DallasTemperature sensors(&oneWire); void setup() { sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("TEMP"); // Выводим текст } void loop() { lcd.createChar(1, simvol); // Создаем символ под номером 1 sensors.requestTemperatures(); // Считываем показания температуры lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(sensors.getTempCByIndex(0)); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.print("\1"); // Выводим символ градуса lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст }ДИМАН ТАВАЙ ПОПРОБУЕМ ДОБИТЬ СЕГОДНЯ ИЛИ ЗАВТРА. А ТО У МЕНЯ ЗАЧЕТ ГОРИТ ПО ЭЛЕКТРОНИКЕ. ПРЕПОД ПОРВЕТ ЕСЛИ ТАКОЕ ЧТО НИБУДЬ НЕ ПРИДУМАЮ . ВЫРУЧИ
ЩА ПОЧИТАЮ. НО КОМПИЛЯЦИЯ ЗАВЕРШЕНА))))))
Я тебе выше дал кусок кода, где в зависимости от температуры что-то делается. Причём - это твой код ;), я просто поправил присвоение значения температуры в переменную, и всё.
ПРОСТО Я ТАКИЕ МЕЛОЧИ МОГУ НЕ ЗАМЕЧАТЬ А ПОТОМ ТЕРЯЮСЬ. Я ВОТ СЕЙЧАС ДАЖЕ СО СВОИМ СТАРЫМ КОДОМ СРАВНИВАЮ И НЕ ВИЖУ ОТЛИЧИЙ. НЕ ВНИМАТЕЛЬНЫЙ ПИПЕЦ
ЩА СИЖУ ЧИТАЮ В ЧЕМ ОШИБКА БЫЛА. НО ВСЕЖЕ НАДО ЭТО В ЖЕЛЕЗЕ ТЕПЕРЬ СОБРАТЬ. дИМАН ДАВАЙ Я ТЕБЕ СОТЕН НА БАЛАНС ЗАКИНУ . ВЕДЬ ПОМОГ . НЕ ПОЛЕНИЛСЯ. НЕ МОГУ НЕ ОТБЛАГОДАРИТЬ
у меня ds18b20 подключенный к 9 пину. он не аналоговый. значит мне надо удалить строку temp = analogRead(tempPin); и заменить на 9 пин ??? как это должно выглядеть?
да , удалить всю функцию надо или переделать, так примерно:
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <DallasTemperature.h> #define DS18B20 9 // Указываем, к какому выводу подключена DQ byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса LiquidCrystal_I2C lcd(0x27, 16, 2); OneWire oneWire(DS18B20); DallasTemperature sensors(&oneWire); int fan = 11; // вывод на вентилятор int led = 8; // вывод на светодиод int temp; int tempMin = 30; // температура начала вращения вентилятора int tempMax = 70; // максимальная температура, когда вентилятор вращается на 100% int fanSpeed; int fanLCD; unsigned long prev = 0; void setup() { sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит pinMode(fan, OUTPUT); pinMode(led, OUTPUT); lcd.begin(); } void loop() { readTemp(); // получаем температуру и печать на LCD if(temp < tempMin) { // если temp меньше минимума fanSpeed = 0; // кулер не вращается digitalWrite(fan, LOW); } if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed } if(temp > tempMax) { // если temp больше максимума digitalWrite(led, HIGH); // включаем светодиод } else { // иначе выключаем светодиод digitalWrite(led, LOW); } } void readTemp() { // получить температуру каждые 3 сек и напечатать на LCD if (millis()-prev>3000){ sensors.requestTemperatures(); temp = sensors.getTempCByIndex(0); prev = millis(); lcd.clear(); lcd.createChar(1, simvol); // Создаем символ под номером 1 lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(temp); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.print("\1"); // Выводим символ градуса lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст lcd.setCursor(0,1); // перевод курсора на следующую сторку lcd.print("FANS: "); lcd.print(fanLCD); // отображение скорости вращения вентилятора lcd.print("%"); }}ДИМАН СКАЖИ В КРАТЦЕ ЧЕМ ОТЛИЧАЕТСЯ КОМАНДА
lcd.print(sensors.getTempCByIndex(0));
ОТ temp = sensors.getTempCByIndex(0);
Не кричи, плз, голова разболелась от заглавных букв.
lcd.print(sensors.getTempCByIndex(0)); - тут ты просто печатаешь температуру с первого датчика на экран
temp = sensors.getTempCByIndex(0); - тут ты сохраняешь температуру с первого датчика в переменную, и потом с этой переменной можешь как угодно и что угодно делать.
теперь понял) хотя с виду одно и тоже написано) напиши номер тлф закину на баланс. спасибо
напиши номер тлф закину на баланс. спасибо
Забей ;)
я твой должник. если что имей ввиду 89202216530