Обогрев дома с 4 датчиками 18B20

vitek73
Offline
Зарегистрирован: 02.03.2014

//0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   синий
//0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
//0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жол с 1точк
//0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3   жол с 2точк
//0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF   жол с 3точк

// 0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   чёрный
// 0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
// 0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жолтый

//ds18b20 140915_1230_датчик температуры 2 и более
// http://arduino-project.net/podklyuchenie-ds18b20-arduino/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9 // датчик подключен к пин 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {
  0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF};  // 3точки
DeviceAddress Thermometer2 = {
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3}; // 2точки
DeviceAddress Thermometer3 = {
  0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54}; // 1точки
DeviceAddress Thermometer4 = {
  0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16}; // синий

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
//  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();


  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);
  sensors.setResolution(Thermometer3, 10);
  sensors.setResolution(Thermometer4, 10);
  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {
  sensors.requestTemperatures();
  Serial.print("T1 ");
  lcd.setCursor(0, 0);
  lcd.print("T1");
// lcd.println (T1);
//lcd.println (T1);
//dataString+=sensors.getTempC(Thermometer2)
  printTemperature(Thermometer1);
  Serial.print("T2  ");
  printTemperature(Thermometer2);
  Serial.print("T3  ");
  printTemperature(Thermometer3);
  Serial.print("T4  ");
  printTemperature(Thermometer4);
}

 

vitek73
Offline
Зарегистрирован: 02.03.2014

//0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   синий
//0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
//0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жол с 1точк
//0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3   жол с 2точк
//0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF   жол с 3точк

// 0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   чёрный
// 0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
// 0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жолтый

//ds18b20 140915_1230_датчик температуры 2 и более
// http://arduino-project.net/podklyuchenie-ds18b20-arduino/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9 // датчик подключен к пин 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {
  0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF};  // 3точки
DeviceAddress Thermometer2 = {
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3}; // 2точки
DeviceAddress Thermometer3 = {
  0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54}; // 1точки
DeviceAddress Thermometer4 = {
  0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16}; // синий

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
//  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();


  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);
  sensors.setResolution(Thermometer3, 10);
  sensors.setResolution(Thermometer4, 10);
  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {
  sensors.requestTemperatures();
  Serial.print("T1 ");
  lcd.setCursor(0, 0);
  lcd.print("T1");
// lcd.println (T1);// не фурычит
// lcd.println (Thermometer1);// не фурычит
// lcd.print (Thermometer1);// не фурычит
//lcd.print (T1);// не фурычит
//dataString+=sensors.getTempC(Thermometer2)
  printTemperature(Thermometer1);
  Serial.print("T2  ");
  printTemperature(Thermometer2);
  Serial.print("T3  ");
  printTemperature(Thermometer3);
  Serial.print("T4  ");
  printTemperature(Thermometer4);
}

Здравствовать всем, начну сразу с вопроса, небольшой затык с выводом температуры на дисплей, на мониторе всё коректно отоброжаетца но на дисплей вывести немогу,  и за этого немогу делать програмку дальше, потому как  проект в следующем, часовой блок, 4строчный индикатор,  3 кнопки для менюшки, 4 датчика 18В20, по замыслу будет отоброжатца температура с 4х точек, через меню заводить подогрев на определённое время, и установка заданной температуры, которую ардуинка будет поддерживать на каждом датчике( тоесть в каждой компате отделно), прошу вашего ответа, почему я немогу вывести температуру на дисплей, тока пожалуста непишите что руки кривые, )

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

Вот, смотрите, в монитор Вы выводите одним способом (через функцию printTemperature), а на дисплей пытаетесь методом тыка писать всё, что попадётся, только бы не так же, как в монитор - т.е. не проверенным, работающим образом.  Для монитора вызвать getTempC надо, а для дисплея и без этого сойдёт, так чтоли?. Выводите также, как в монитор (запросите температуру getTempC , преобразуйте её в строку, а уж строку выводите) и всё выведется. 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

На мой взгляд, выводить на печать внутри функции - не очень удобно, т.к. один раз Вам захотелось выводить в ком-порт, другой раз - на LCD дисплей (третий раз - куда-нибудь отправить через http get). Если бы функция возвращала просто  переменную, готовую к выводу куда угодно, то, получив эту переменную, Вы бы легко делали вывод туда, куда требуется уже в теле программы.

Тут еще нюанс в том, что часто дергать DS18B20 - не хорошо, т.к. сам по себе цикл опроса датчиков занимает определенное, весьма ощутимое, время: а так - запросили температуру раз в минуту, и делайте потом с ней что угодно...

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

Причём тут внутри функции или снаружи. Просто, чтобы вывести в монитор Вы сначала спрашиваете значение температуры, а потом его выводите. А на экран хотите выводить не спрашивая. А что выводить-то, если Вы не спросили? Скетч чужой? Вы не понимаете что он делает?

vitek73
Offline
Зарегистрирован: 02.03.2014

ЕВГЕНИЙ вы прям в точку попали,естественно скет не мой , я тока изменил адреса по свои датчики, еслиб я понимал всё яб как вы наверно уже догодались, не спрашивал такие приметивные вопросы, дажы когда вы сказали в чём ошибка, я честно говоря пока несооброжу как это поправить, ну да,да, я ещё не профи, ну не ругать же меня за это,  :-)

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

Ну, чего ж Вы там такого не сообразите?

Ну, блин, у Вас есть функция printTemperature, которая нормально работает, так? Ну, сделайте Вы ТОЧНО такую же функцию printTemperature1 только строку Serial.print... в ней замените на вывод на экран. В остальном точно такую же! И вызывайте её точно также - printemperature1(Termomenter1) - выведет.

bwn
Offline
Зарегистрирован: 25.08.2014

Что у вас делает 49 строка?
И где такая строка для LCD?
Ответив на два простых вопроса, достигнем второго уровня понимания.

О, Евгений опередил))))
 

vitek73
Offline
Зарегистрирован: 02.03.2014

 вроде чтото начало показывать, осталось понять что показывает, и почему вместо темп

//0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   синий
//0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
//0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жол с 1точк
//0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3   жол с 2точк
//0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF   жол с 3точк

// 0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16   чёрный
// 0x28, 0x22, 0xAA, 0xB9, 0x05, 0x00, 0x00, 0x7F   красный
// 0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54   жолтый

//ds18b20 140915_1230_датчик температуры 2 и более
// 
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9 // датчик подключен к пин 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {
  0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF};  // 3точки
DeviceAddress Thermometer2 = {
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3}; // 2точки
DeviceAddress Thermometer3 = {
  0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54}; // 1точки
DeviceAddress Thermometer4 = {
  0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16}; // синий

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
//  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();


  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);
  sensors.setResolution(Thermometer3, 10);
  sensors.setResolution(Thermometer4, 10);
  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {
  sensors.requestTemperatures();
  Serial.print("T1 ");
  lcd.setCursor(0, 0);
  lcd.print("T1 ");
  lcd.print(int(Thermometer1));//вместо 25 показывает 280 по остальным тоже непонятные цыфры

  printTemperature(Thermometer1);// на монитор выводит правильно 25.00
  Serial.print("T2  ");
  printTemperature(Thermometer2);// на монитор выводит правильно 25.00
  Serial.print("T3  ");
  printTemperature(Thermometer3);// на монитор выводит правильно 25.00
  Serial.print("T4  ");
  printTemperature(Thermometer4);// на монитор выводит правильно 25.00
}

ературы вывело непонятно что, )

bwn
Offline
Зарегистрирован: 25.08.2014

Вы просто так строки тычете, куда понравится? По шагам можете рассказать, что и где происходит?
Расскажите последовательно, что делают строки 59, 60 , 47, 48, 49.

vitek73
Offline
Зарегистрирован: 02.03.2014
 
47 void printTemperature(DeviceAddress deviceAddress) {
//ПРЕДПОЛОГАЮ ЧТО ЧТОТО ДЕЛАЕТ С АДРЕСОМ
48  float tempC = sensors.getTempC(deviceAddress);
//ПРИСВАИВАЕТ ЗНАЧЕНИЕ ДАТЧИКА К ТЕМПС
49  Serial.println(tempC);
//ВЫВОДИТ ЗНАЧЕНИЕ ДАТЧИКА
59  Serial.print("T2  ");
//НУ ЭТО ПРОСТО КОМЕНТАРИИ НА ДИСПЛЕЕ
60  printTemperature(Thermometer2);// на монитор выводит правильно 25.00
// А ЭТО ВРОДЕ ДАННЫЕ С ДАТЧИКА 1
НУ Я ПО ОНАЛОГИИ ПОПРОБОВАЛ ТАКИМ ЖЕ СПОСОБОМ ВЫВЕСТИ ТОКА НЕ НА МИНИТОР А НА ДИСПЛЕЙ, ИСПОЛЬЗУЯ (Thermometer2), НУ Я НАВЕРНО ВСЁЖ ОПЯТЬ ЧЕГОТО НЕДОГОНЯЮ )) ПОХОЖЕ ЧТО ВМЕСТО ТЕМПЕРАТУРЫ ОН МНЕ ВЫВОДИТ АДРЕС НА ЖК.))
 
 
 
bwn
Offline
Зарегистрирован: 25.08.2014

Исправлю:

47 - начало функции считывания и печати с параметром
48- присваивает значение температуры переменной tempC инициированной как float
49  - выводит в сериал значение tempC
50 - завершение функции и возврат

59 - выводит в сериал предварительную информацию
60 - вызывает вышеназванную функцию и передает ей параметр.

Так где у вас выводятся данные температуры в сериал и откуда они должны выводится на LCD?

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

Блин, ну я же Вам написал - сделайте вторую функцию, которая отличается от printTemperature одной строкой и вызывайте её. Вам нравится упорствовать и писать бред вроде lcd.print(int(Thermometer1));? Ну, удачи!

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

Блин, ну я же Вам написал - сделайте вторую функцию, которая отличается от printTemperature одной строкой и вызывайте её. Вам нравится упорствовать и писать бред вроде lcd.print(int(Thermometer1));? Ну, удачи!

Да похоже человек не представляет, что такое функция и зачем она нужна. Я предпологал, что нынче в школе хотя бы основы Бейсика дают. Ошибся.(((( Логика нынче не в моде.((((

vitek73
Offline
Зарегистрирован: 02.03.2014

Какие вы всёже терпиливые, а я всё равно эту ардуиновскую лего никак нсоберу,

выб мне как говоритца прям в пример ткнули куда какой кирпич положить, а то говорите этот кирпич не кирпичный, этот вобще нетого цвета, а это не той констинценции, ну это алигория, просто на рабочем примере мне проще уеснить нежели вы так непонятно пытаетесь всё расжевать мне, неее я конечно это ценю, но не понимаю пока этих нюансов, вот последний неудачный эксперемент, хоть на нём ткните куда и сто дописать чтоб собралось задуманое )

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9 // датчик подключен к пин 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensorss(&oneWire);
DeviceAddress Thermometer1 = {
  0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF};  // 3точки
DeviceAddress Thermometer2 = {
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3 }; // 2точки
DeviceAddress Thermometer3 = {
  0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54 }; // 1точки
DeviceAddress Thermometer4 = {
  0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16 }; // синий

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  lcd.init();                      // initialize the lcd
  lcd.init();
  lcd.backlight();

  sensorss.begin();
  sensorss.setResolution(Thermometer1, 10);
   sensorss.setResolution(Thermometer2, 10);
  sensorss.setResolution(Thermometer3, 10);
  sensorss.setResolution(Thermometer4, 10);  
  Serial.begin(9600);
}
float tempC;
void printTemperature(DeviceAddress deviceAddress) {
//  float tempC = sensorss.getTempC(deviceAddress);
tempC = sensorss.getTempC(deviceAddress);
  Serial.println(tempC);
}
/////////////////////
void loop() {
  start:
  sensorss.requestTemperatures();
  printTemperature(Thermometer1);
  printTemperature(Thermometer2);
  printTemperature(Thermometer3);
  printTemperature(Thermometer4); 
//  Serial.print("T1 ");
lcd.clear();
  lcd.setCursor(0, 0);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
 lcd.print(int(Thermometer1));//вместо 25 выводит 280
 // lcd.print(float(Thermometer1,DEC));//вместо 25 выводит 280
  lcd.print(" T1-");  
  lcd.print(tempC);//вместо 25 выводит 280
  delay (5000);
    lcd.setCursor(0, 1);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
  lcd.print(int(Thermometer2));//вместо 25 выводит 272
  lcd.print(" T2-");  
  lcd.print(tempC);//вместо 25 выводит 280
  delay (5000); 
 lcd.clear(); 
    lcd.setCursor(0, 0);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
  lcd.print(int(Thermometer3));//вместо 25 выводит 280
  lcd.print(" T3-");  
  lcd.print(tempC);//вместо 25 выводит 264
  delay (5000); 
        lcd.setCursor(0, 1);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
  lcd.print(int(Thermometer4));//вместо 25 выводит 256
  lcd.print(" T4-");  
  lcd.print(tempC);//вместо 25 выводит 280
  // я подозреваю что Thermometer1 -Thermometer4 выводит адреса датчиков а не температуру
  delay (5000); 
  
//   lcd.print(sensorss); 
 goto start;
 ////////////////////////////////////////////
  
//lcd.print(int(tempC)); // если надо выводить знаки после запятой - убери инт и скобки вокруг переменной
  lcd.print(" T2-");
lcd.print(int(Thermometer2));//вместо 25 выводит 272
  lcd.setCursor(0, 1);
  lcd.print(" T3-");//вместо 25 выводит 264
lcd.print(int(Thermometer3)); // если надо выводить знаки после запятой - убери инт и скобки вокруг переменной
  lcd.print(" T4-");
lcd.print(int(Thermometer4));//вместо 25 выводит 256
// lcd.println (T1);// не фурычит
// lcd.println (Thermometer1);// не фурычит

// printTemperature(Thermometer1);

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Хосподи, вы это специально? Издеваетесь?
Допишите вы в своем первом коде между 49 и 50 строками еще одну: lcd.print (tempC);
Может это на размышления наведет.

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

vitek73 пишет:

выб мне как говоритца прям в пример ткнули куда какой кирпич положить, 

Витёк, ну куда уж прямее. Я Вам третий раз говорю, у Вас в тексте есть функция printTemperature. Сделайте ТОЧНО ТАКУЮ ЖЕ, только вместо Serial.print вставьте в неё lcd.print и вызовете её так же и в том же месте, где printTemperature.

Я это говорю ТРЕТИЙ раз. Вы игнорируете, а потом заявляете, что Вам не помогают.

Чего из того, что я написал Вы не можете сделать? Три строчки скопипастить? Или ещё чего?

vitek73
Offline
Зарегистрирован: 02.03.2014
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9 // датчик подключен к пин 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensorss(&oneWire);
DeviceAddress Thermometer1 = {
  0x28, 0x7E, 0x7B, 0xB9, 0x05, 0x00, 0x00, 0xBF};  // 3точки
DeviceAddress Thermometer2 = {
  0x28, 0xE9, 0x46, 0xB9, 0x05, 0x00, 0x00, 0xE3 }; // 2точки
DeviceAddress Thermometer3 = {
  0x28, 0x45, 0xC3, 0xB8, 0x05, 0x00, 0x00, 0x54 }; // 1точки
DeviceAddress Thermometer4 = {
  0x28, 0x9A, 0xD4, 0xB9, 0x05, 0x00, 0x00, 0x16 }; // синий

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  lcd.init();                      // initialize the lcd
  lcd.init();
  lcd.backlight();

  sensorss.begin();
  sensorss.setResolution(Thermometer1, 10);
   sensorss.setResolution(Thermometer2, 10);
  sensorss.setResolution(Thermometer3, 10);
  sensorss.setResolution(Thermometer4, 10);  
  Serial.begin(9600);
}
float tempC;
 // Serial.lcd.println(printTemperature);//не компилируетца
 void printTemperature(DeviceAddress deviceAddress) {
//void lcd.printTemperature(DeviceAddress deviceAddress) {
//void printTemperature(DeviceAddress deviceAddress) {
  //  float tempC = sensorss.getTempC(deviceAddress);
tempC = sensorss.getTempC(deviceAddress);

  Serial.println(tempC);
 // Serial.lcd.println(tempC);// не компилируетца
 //  Serial.lcd.print(Temepature);
  lcd.print(tempC);
  
}
/////////////////////
void loop() {
  start:
  sensorss.requestTemperatures();
   lcd.print(tempC);
  //  lcd.print Temperature(Thermometer1);
  printTemperature(Thermometer1);
//   print("T1"); 
//  lcd.print(Thermometer1);// ошибка компиляции
  printTemperature(Thermometer2);
 // printTemperature(Thermometer3);
 // printTemperature(Thermometer4); 
//  Serial.print("T1 ");
lcd.print (tempC);
lcd.clear();
  lcd.setCursor(0, 0);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
  lcd.print (tempC);
 lcd.print(int(Thermometer1));//вместо 25 выводит 280
 // lcd.print(float(Thermometer1,DEC));//вместо 25 выводит 280
  lcd.print(" T1-");  
  lcd.print(tempC);//все датчики показывают одну и туже температуру,
  delay (5000);
    lcd.setCursor(0, 1);
  // тобиш на монитор с этих датчиков выдаёт чётко 25.60
  // а на дисплей какуюто фигню.
  lcd.print(int(Thermometer2));//вместо 25 выводит 272
  lcd.print(" T2-");  
  lcd.print(tempC);//все датчики показывают одну и туже температуру,
  delay (5000); 
 lcd.clear(); 
 //все датчики показывают одну и туже температуру,
  // я подозреваю что Thermometer1 -Thermometer4 выводит адреса датчиков а не температуру
  //выводитца адрес датчика( что мне как то фиолетово
  // выводитца номер датчика, (Т1....) ну это я научился делать )))
  // и теперечи выводитца одна и таже температура на всех датчиках,
  // грею один меняетца на всех,это когда выводитца на дисплей,
  //на мониторе отображаетца коректно, все датчики разную температуру,
  // уххх  и почему меня посещяет мысль что я такой невнимательный? )
  
  delay (5000); 
 //   lcd.print(sensorss); 
 goto start;
 }

 

bwn
Offline
Зарегистрирован: 25.08.2014

Витек, бросьте вы это дело, дом взорвете(((. Евгений вам предложил продублировать функцию, я предложил поиграть с той, что есть, но в варианте вашего первого кода. Вы не делаете ни того ни другого. Последний вариант, это видения напившегося наркомана, после дозы. Причем с каждым новым релизом вы его улучшаете, придумываете новый формат команд "lcd.print(int(Thermometer2));", зачем то приплели "go to start", нигде не указав метку куда перейти и т.п.
Нетрудно написать за вас этот кусок, но дальше вас ждут исполнительные команды, а главное "меню". Либо вы поймете сами, как это делать, либо сразу в "ищу исполнителя". Давайте попробуем еще раз:
Мой вариант - берете код из вашего первого поста, после строки 49 добавляете lcd.print (tempC);
после строк 60, 62, 64 добавляете ваши 54 и 55, не забывая перемещать курсор в нужные позиции и менять нумерацию температуры. Компилируем, температура выводится в сериале и дублируется на дисплее.
Вариант Евгения - берете код из первого поста, копируете строки с 47 по 50 и вставляете после 50. В скопированном коде меняете void printTemperature  на void printTemperature1 а Serial.println (tempC); на lcd.print (tempC);.
После 55 строки вставляете printTemperature1(Thermometer1); после 60, 62, 64 дублируете ваши 54, 55 и вновь вставленную, правите в них позицию курсора, нумерацию температуры и номер датчика. Все.
В моем варианте у вас получилась одна функция printTemperature выводящая значение температуры в сериал и на дисплей. В варианте Евгения вы получили две функции - printTemperature и printTemperature1 первая выводит в сериал, вторая на lcd.
Вся нумерация строк по коду из первого поста, без учета вновь вставленных

Если и сейчас не поняли, читаем первое предложение.

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

Витёк,

Что печатает 42-ая строка? Надеюсь, то же самое, что и 39-ая?

Похоже, Вы пишете в код что попало, методом тыка, и никакая наша помощь Вам не помогает потому, что у Вас не хватает знаний понять, что Вам говорят.

Поэтому, единственный способ Вам помочь, такой: сейчас Вы:

1. Берёте книгу http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

2. Читаете её, разбирая все примеры.

3. Читаете ещё раз, вколачивая примеры в компьютер и убеждаясь, что они работают так, как Вы ожидаете.

4. Только после этого (это займёт с неделю) возвращаетесь к своему скетчу и спокойно его дожимаете без посторонней помощи.

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

Удачи!

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП, мне кажется, что вы горячитесь, рекомендуя Ритча начинающим. Я его читаю с удовольствием, но попади он мне первым, боюсь были бы проблемы. Книга заточена под язык, а Ардуино IDE все таки его обрезает. Для начального уровня я рекомендовал бы - Уилли Соммера "Программирование микроконтроллерных плат Arduino/Freeduino", освоив ее уже можно браться за Ритча. ИМХО.

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

bwn, ну, на вкус и цвет. Мне эта книга нравится своей систематичностью. Там описано всё и при этом всё увязано между собой в некую логику, потому появляются не только знания, но и "чуство языка", позволяющее интуитивно написать правильно, даже если забыл конкретные знания. Я своим студентам всегда рекоммендую её, а следом Страуструпа.

Кстати, а что там обрезано? Вроде, кроме того, что некоторые библиотеки сокращены (типа, нет плавающей точки в форматах printf) сам то язык вполне себе полный (он и не может быть неполным, т.к. в итоге вызывается штатный gcc). Что меня бесит в IDE - это их "упрощение" с include'ами. Какие-то сами вставляются, какие-то пишешь в "", располагаешь в той же директории, ан хрен там. Нахрена было "упрощать" и толком не документировать? Никогда не могу понять их логику.

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП, вы программист и многие вещи уже воспринимаете как данность. Если неофит возьмет самый первый пример и попробует использовать в Ардуино IDE, боюсь у него ничего не выйдет:

"Си-программа, печатающая "здравствуй, мир", выглядит так:
#include <stdio.h>
main()
{
printf ("здравствуй, мир\n");
}
Как запустить эту программу, зависит от системы, которую вы используете. Так, в операционной системе UNIX
необходимо сформировать исходную программу в файле с именем, заканчивающимся символами ".c",
например, в файле hello.c, который затем компилируется с помощью команды
CC hello.с"
 

Из этого и заключаю, что данная книга для более высокой лиги. У Соммера все сделано под Ардуино и на детском уровне. Поняв, что происходит у него, Ритча уже будешь воспринимать  совершенно правильно. Я его нашел по Вашей ссылке и очень Вам благодарен, ибо у самого знания в программировании были на уровне самоучителя Синклер Бейсика, да с 20 летним перерывом. Поэтому говорю именно с позиции неофита.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ЕвгенийП пишет:
Причём тут внутри функции или снаружи.

При том, что если бы функция возвращала в переменной данные от термометра - то потом было бы почти все равно: куда их выводить. Т.е., каждая маленькая функция должна быть универсальна, как молоток.

Плодить фактически дублирующие друг друга функции - имеет смысл только если Вам платят за количество строчек кода. :) Да, а потом Вы будете объяснять новичку - почему плохо каждый цикл дважды опрашивать DS18B20.

bwn
Offline
Зарегистрирован: 25.08.2014

Андрей, здесь человек просто тупит откровенно, какая уж оптимизация функций.

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

Андрей, человек не может скопипастить функцию, а Вы про какую-то универсальность. Я уже сдался с ним работать. Попробуйте, может у Вас получится :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

bwn пишет:
Андрей, здесь человек просто тупит откровенно, какая уж оптимизация функций.

Просто человек не ориентируется ни в типах данных, ни в массивах... Ему бы все это упростить до:

void loop() {

tempC = sensorss.getTempC(deviceAddress);

....

   Serial.print(tempC);

   lcd.clear(); lcd.setCursor(0, 0); lcd.print(tempC);

}

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

А заодно, не знает что такое функция, что такое её вызов и пишет Serial.lcd.print

Нет, ему бы не упростить, а почитать хорошую книжку, что я ему и посоветовал.

Любая другая помощь - просто написать за него. Но это поможет ровно до того момента, как ему снова понадобится что-то вывести (например, к температуре добавить время замера) - опять придётся за него писать. 

Ему же самому приятнее будет прочитать, разобраться и делать такие простые вещи самостоятельно.

bwn
Offline
Зарегистрирован: 25.08.2014

Ему в итоге и предложили почитать "Буквари", а после уже "Войну и мир" писать.))))

vitek73
Offline
Зарегистрирован: 02.03.2014

ну ладно не сердитесь, я всё понял, нашёл где лего невставлялось, ну да не с первого раза понял, и не со второго, даже не с третьего, но понял же ))))), яж говорил на примерах оно легче чем на пальцах, спасибо за ваше терпение, буду дальше писать, отталкиваясь от первого примера, тама дальше как было упомянута будет менюшка для уставок заданых температур и регулировка нагревателей на кждый датчик, на энное время покину вас пока не набирутца новые затыки,  попожее напишу что получитца с шедевром ))

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

vitek73 пишет:

 буду дальше писать, отталкиваясь от первого примера

Сначала книжку почитать! А не то очень быстро

vitek73 пишет:

набирутца новые затыки

просто сразу же, при первой попытке!

bwn
Offline
Зарегистрирован: 25.08.2014

Лучше возвращайтесь не с новыми затыками, а с новыми знаниями.
И не берите первый код за ядро вашего термостата, плохо получится.
Когда будете готовы писать, нарисуйте блок-схему вашей программы, далее подробные алгоритмы для каждого блока.
Когда сумеете расписать алгоритмы, можете сказать себе "я готов попробовать воплотить это в код"
Как то так.