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

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017
   #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; 
    }

 

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

сейчас отключил датчик температуры, а он все равно показывает 401-415 градусов. где то я забыл подружить датчик температуры с дисплеем

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

В строке 20 Вы определли функцию "float temperature()" но потом нигде и ни разу её не используете!

Вы считаете, что температуру у Вас читает функция "int readTemp()" (строка 56), но она никак (от слова совсем) не использует Ваш температурный датчик, объявленный в строке 4 - вообще никак не использует.

Вот и и думайте

1. Зачем Вам температурнй датчик, который Вы не используете?
2. Зачем Вам функция, которая ни разу не вызывается.

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

Спасибо Женя. Сейчас попробую исправить. 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Нестыковка тут:

int tempPin = 9; // выход ds18b20

temp = analogRead(tempPin);

У вас датчик Даллас или что-то аналоговое?

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

даллас , я тоже об этом думаю. мне кажется где то здесь ошибка

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

УЧУСЬ АРДУИНИТЬ пишет:

мне кажется где то здесь ошибка

Эта фраза - лучшая за сегодняшний вечер :) :) :)

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

Хоть кому то настроение поднял))))

можно и лайк поставить))

 

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

вообще вот мой скетч который я доработал 

#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");                             // Выводим текст 
}

он отлично работает. но как только я начинаю работать с вентилятором то начинается трындец. может подскажете. как правильно добавить вентилятор в скетч. чтобы можно было контролировать обороты

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

что то типа такого

................

}
    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);
    }

это отрывок из скетча который я нашел в инете

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

грубо говоря было три скетча

1. датчик температур

2. дисплей 1602

3. вентилятор.

первые 2 я успешно объеденил а вот третий добавить не получается

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015
float tempC = sensors.getTempCByIndex(0);

Дальше - у вас уже есть кусок кода, который оперирует с tempC. Создайте только переменные tempMin и tempMax, в которые запишите максимальную и минимальную температуры.

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

но у меня в 9 и 10 строке уже есть определенные минимум и максимум разве это не должно работать?

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

у меня ds18b20 подключенный к 9 пину. он не аналоговый. значит мне надо удалить строку temp = analogRead(tempPin); и заменить на 9 пин ??? как это должно выглядеть?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пробуй. Я не компилировал, главное, чтобы ты понял, что к чему:

#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
    }
}

 

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

РЕБЯТ, КОРОЧЕ, ЕСЛИ СМОЖЕМ В БЛИЖАЙШЕЕ ВРЕМЯ ВОТ К ЭТОМУ СКЕТЧУ ДОБАВИТЬ КОМАНДЫ ВЕНТИЛЯТОРУ ,ЧТОБЫ ОН ПРИ 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");                             // Выводим текст 
}

 

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

ДИМАН ТАВАЙ ПОПРОБУЕМ ДОБИТЬ СЕГОДНЯ ИЛИ  ЗАВТРА. А ТО У МЕНЯ ЗАЧЕТ ГОРИТ ПО ЭЛЕКТРОНИКЕ. ПРЕПОД ПОРВЕТ ЕСЛИ ТАКОЕ ЧТО НИБУДЬ НЕ ПРИДУМАЮ . ВЫРУЧИ

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

ЩА ПОЧИТАЮ. НО КОМПИЛЯЦИЯ ЗАВЕРШЕНА))))))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Я тебе выше дал кусок кода, где в зависимости от температуры что-то делается. Причём - это твой код ;), я просто поправил присвоение значения температуры в переменную, и всё.

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

ПРОСТО Я ТАКИЕ МЕЛОЧИ МОГУ НЕ ЗАМЕЧАТЬ А ПОТОМ ТЕРЯЮСЬ. Я ВОТ СЕЙЧАС ДАЖЕ СО СВОИМ СТАРЫМ КОДОМ СРАВНИВАЮ И НЕ ВИЖУ ОТЛИЧИЙ. НЕ ВНИМАТЕЛЬНЫЙ ПИПЕЦ

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

ЩА СИЖУ ЧИТАЮ В ЧЕМ ОШИБКА БЫЛА. НО ВСЕЖЕ НАДО ЭТО В ЖЕЛЕЗЕ ТЕПЕРЬ СОБРАТЬ. дИМАН ДАВАЙ Я ТЕБЕ СОТЕН НА БАЛАНС ЗАКИНУ . ВЕДЬ ПОМОГ . НЕ ПОЛЕНИЛСЯ. НЕ МОГУ НЕ ОТБЛАГОДАРИТЬ

MaksVV
Offline
Зарегистрирован: 06.08.2015

УЧУСЬ АРДУИНИТЬ пишет:

у меня 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("%");
    
    }}

 

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

ДИМАН СКАЖИ В КРАТЦЕ ЧЕМ ОТЛИЧАЕТСЯ КОМАНДА 

         lcd.print(sensors.getTempCByIndex(0));  

 

ОТ     temp = sensors.getTempCByIndex(0);

         lcd.print(temp); 
 
 
ИНАЧЕ Я МОГУ И В ДАЛЬНЕЙШЕМ ЭТУ ОШИБКУ СОВЕРШАТЬ
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Не кричи, плз, голова разболелась от заглавных букв. 

 lcd.print(sensors.getTempCByIndex(0));   - тут ты просто печатаешь температуру с первого датчика на экран

temp = sensors.getTempCByIndex(0); - тут ты сохраняешь температуру с первого датчика в переменную, и потом с этой переменной можешь как угодно и что угодно делать.

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

теперь понял) хотя с виду одно и тоже написано) напиши номер тлф закину на баланс. спасибо

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

УЧУСЬ АРДУИНИТЬ пишет:

напиши номер тлф закину на баланс. спасибо

Забей ;)

УЧУСЬ АРДУИНИТЬ
Offline
Зарегистрирован: 30.12.2017

я твой должник. если что  имей ввиду 89202216530