подскажите чайнику. 2датчика температуры: улица и помещение

DizZ
Offline
Зарегистрирован: 04.12.2013

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

DizZ
Offline
Зарегистрирован: 04.12.2013

Не могу разобраться

Клапауций
Offline
Зарегистрирован: 10.02.2013

примерно так:

улица: +7 С

помещение: +23 С

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

Клапауций пишет:

примерно так:

улица: +7 С

помещение: +23 С

Неправильно :)

Улица и теплота воды: +27 С

Помещение: +22 С

DizZ
Offline
Зарегистрирован: 04.12.2013

Приколисты блин, с кодом на 2 датчика помогите

Сегодня уже поздно завтра более подробно все опишу

Клапауций
Offline
Зарегистрирован: 10.02.2013

DizZ пишет:
Сегодня уже поздно завтра более подробно все опишу

не, не нужно описывать - я сам за ночь догадаюсь

maksim
Offline
Зарегистрирован: 12.02.2012

Код на два датчика:

int temp_1 = dat4ik_1.read();
int temp_2 = dat4ik_2.read();
display.write("улица ");
display.write(temp_1);
display.write("помещение ");
display.write(temp_2);

UPD:
А вообще у вас проблемы не с программированием, как и у многих "новичков", все гораздо хуже... Проблема кроется в глобальном непонимании окружающего вас мира, ведь вы создавая эту тему даже и не подумали что в мире существует тысячи типов датчиков температуры, которые можно подключить к ардуине, вы ведь даже не предположили, что есть десятки схем подключения каждого из этих датчиков и самое главное - код... кода может быть написано миллион вариаций, ибо каждый человек мыслит по своему.

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

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

DizZ
Offline
Зарегистрирован: 04.12.2013

maksim пишет:

Код на два датчика:

int temp_1 = dat4ik_1.read();
int temp_2 = dat4ik_2.read();
display.write("улица ");
display.write(temp_1);
display.write("помещение ");
display.write(temp_2);

UPD:
А вообще у вас проблемы не с программированием, как и у многих "новичков", все гораздо хуже... Проблема кроется в глобальном непонимании окружающего вас мира, ведь вы создавая эту тему даже и не подумали что в мире существует тысячи типов датчиков температуры, которые можно подключить к ардуине, вы ведь даже не предположили, что есть десятки схем подключения каждого из этих датчиков и самое главное - код... кода может быть написано миллион вариаций, ибо каждый человек мыслит по своему.

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

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

Про датчики и типы подключения не рассказывайте я КИПовец а вот за код огромное спасибо помогли, так еще не пробовал

DizZ
Offline
Зарегистрирован: 04.12.2013

И так, теперь я не пойму в какую часть всунуть

Сам код:


#include <LiquidCrystal.h>
#include <math.h>


LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD

int backLight = 13;

void setup(void) {
  pinMode(backLight, OUTPUT);
  
  digitalWrite(backLight, HIGH); 
  lcd.begin(16, 2);             
  lcd.clear();                  
  lcd.setCursor(10,0);   

}

 // создаем метод для перевода показаний сенсора в градусы Цельсия 
double Getterm(int RawADC) {
  double temp;
  temp = log(((10240000/RawADC) - 10000));
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;
  return temp;
}

// создаем метод для вывода на экран показаний сенсора
void printTemp(void) { 
  double temp = Getterm(analogRead(3));  // считываем показания с сенсора
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temp");
  lcd.setCursor(5,0);
  lcd.print(temp);
  lcd.print(" C");
  
  }


void loop(void) {
  printTemp(); // вызываем метод, созданный ранее
  delay(1000);
}

Не стебайтесь только сильно, только учусь, из програмирования частично помню только бейсик который учил 20 лет назад )))

MaksMS
Offline
Зарегистрирован: 11.03.2013


void printTemp(void) { 

 lcd.clear();
lcd.setCursor(0,0);
 double temp = Getterm(analogRead(3));  // считываем показания с сенсора 1
lcd.print("Temp");
lcd.setCursor(5,0);

 double temp = Getterm(analogRead(2));  // считываем показания с сенсора 2
lcd.print(temp);
 lcd.print(" C");
   
  }

Да..слабовато с программированием..

конечно lcd.clear(); тут особо не нужен,лучше в конце добавить в выводы пробелы..

 

DizZ
Offline
Зарегистрирован: 04.12.2013

Вернулся к той же проблеме с которой столкнулся сам

Arduino: 1.5.5 (Windows 7), Board: "Arduino Uno"
 
temperatur.ino: In function 'void printTemp()':
temperatur:38: error: redeclaration of 'double temp'
temperatur:34: error: 'double temp' previously declared here
 
 
step962
Offline
Зарегистрирован: 23.05.2011

DizZ пишет:

Про датчики и типы подключения не рассказывайте я КИПовец [...]

Что же Вы, "как КИПовец", даже тип датчика не указываете?

Даже если с его подключением у Вас никаких вопросов нет, алгоритмы обработки данных, предположим, с Pt100 и DS18B20 абсолютно разные.

Вам ли, "как КИПовцу", этого не знать...

DizZ
Offline
Зарегистрирован: 04.12.2013

как не крути алгоритм схож ну раз уж вам это так важно Термистор NTC 10kR(25°C)

step962
Offline
Зарегистрирован: 23.05.2011

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

Если отвечавшие угадали, что же конкретно Вам требовалось, то и чудненько - не будет многостраничной инсценировки заезженной на этом форуме картины "партизан на допросе"...

DizZ
Offline
Зарегистрирован: 04.12.2013

В принципе пользователи угадали, но из программы видно какой я дисплей использую только проблема не решена, выдает все ту же ошибку.

Имеем: 

1. Arduino Uno 

2. LCD 1602

3. 2 датчика NTC 10kR

Код для одного датчика:

// подключаем две библиотеки для работы с LCD и математических вычислений
#include <LiquidCrystal.h>
#include <math.h>


LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD

int backLight = 13;

void setup(void) {
  pinMode(backLight, OUTPUT);
  
  digitalWrite(backLight, HIGH); 
  lcd.begin(16, 2);             
  lcd.clear();                  
  lcd.setCursor(0,0);   

}

 // создаем метод для перевода показаний сенсора в градусы Цельсия 
double Getterm(int RawADC) {
  double temp;
  temp = log(((10240000/RawADC) - 10000));
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;
  return temp;
}

// создаем метод для вывода на экран показаний сенсора
void printTemp(void) { 
  double temp = Getterm(analogRead(4));  // считываем показания с сенсора
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperature is:");
  lcd.setCursor(0,1);
  lcd.print(temp);
  lcd.print(" C");
  
  }


void loop(void) {
  printTemp(); // вызываем метод, созданный ранее
  delay(1000);
}

Проблема в том, что как я не крутил со строками выдает одну и ту же ошибку:

temperatur.ino: In function 'void printTemp()':
temperatur:38: error: redeclaration of 'double temp'
temperatur:34: error: 'double temp' previously declared here
 
С выше предложенным кодом выскочила та же ошибка, на сколько я понимаю из написанного в ошибке, он ругается на попытку инициализировать второй датчик, помогите плз
MaksMS
Offline
Зарегистрирован: 11.03.2013

Да вроде нет ошибок никаких ,проверял на версии ИДЕ 1.0.5

DizZ
Offline
Зарегистрирован: 04.12.2013

Именно тут нет но эта програмка на 1 двтчик надо на 2 код уоторый посоветовали выше выдал все ту же ошибку

MaksMS
Offline
Зарегистрирован: 11.03.2013

А...

void printTemp(void) { 

 lcd.clear();
lcd.setCursor(0,0);
 double temp = Getterm(analogRead(3));  // считываем показания с сенсора 1
lcd.print("Temp");
lcd.setCursor(5,0);

 double temp2 = Getterm(analogRead(2));  // считываем показания с сенсора 2
lcd.print(temp2);
 lcd.print(" C");
   
  }

 

maksim
Offline
Зарегистрирован: 12.02.2012

step962 пишет:

алгоритмы обработки данных, предположим, с Pt100 и DS18B20 абсолютно разные.

DizZ пишет:

как не крути алгоритм схож

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

 

DizZ
Offline
Зарегистрирован: 04.12.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Да только temp забыли вывести

void printTemp() 
{ 
  lcd.clear();
  
  lcd.setCursor(0, 0);
  double temp = Getterm(analogRead(3));  // считываем показания с сенсора 1
  lcd.print("Temp1");
  lcd.print(temp);
  lcd.setCursor(6,0);
  lcd.print(" C");
  
  lcd.setCursor(0, 1);
  double temp2 = Getterm(analogRead(2));  // считываем показания с сенсора 2
  lcd.print("Temp2");
  lcd.print(temp2);
  lcd.setCursor(6,1);
  lcd.print(" C");
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

DizZ пишет:

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

Это вы называете "вопрос был конкретен" ???

DizZ пишет:

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

Именно из-за такого вопроса здесь и развилась вся эта демагогия... Кстати, в результате которой и выясняется вся остальная информация.

DizZ
Offline
Зарегистрирован: 04.12.2013
// подключаем две библиотеки для работы с LCD и математических вычислений
#include <LiquidCrystal.h>
#include <math.h>


LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // инициализируем LCD

int backLight = 13;

void setup(void) {
  pinMode(backLight, OUTPUT);
  
  digitalWrite(backLight, HIGH); 
  lcd.begin(16, 2);             
  lcd.clear();                  
  lcd.setCursor(0,0);   

}

 // создаем метод для перевода показаний сенсора в градусы Цельсия 
double Getterm(int RawADC) {
  double temp;
  temp = log(((10240000/RawADC) - 10000));
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;
  return temp;
}

// создаем метод для вывода на экран показаний сенсора
void printTemp()
{ 
    lcd.clear();
  lcd.setCursor(0,0);
  double temp = Getterm(analogRead(4));  // считываем показания с сенсора
  lcd.print("Temp:");
  lcd.print(temp);
  lcd.setCursor(5,0);
  lcd.print(" C");
  
  lcd.setCursor(0,1);
   double temp = Getterm(analogRead(3));  // считываем показания с сенсора 2
  lcd.print("Temp2");
  lcd.print(temp2);
  lcd.setCursor(5,1);
  lcd.print(" C");
  
  }


void loop(void) {
  printTemp(); // вызываем метод, созданный ранее
  delay(1000);
}
temperatur.ino: In function 'void printTemp()':
temperatur:41: error: redeclaration of 'double temp'
temperatur:34: error: 'double temp' previously declared here
temperatur:43: error: 'temp2' was not declared in this scope
 
 
история повторяется
 
DizZ
Offline
Зарегистрирован: 04.12.2013

С вашим кодом тоже ругается, ниже выложил код и ошибку на сколько я понимаю еще в расчетах надо делать какие то изменения

DizZ
Offline
Зарегистрирован: 04.12.2013

Смотрите ниже

maksim
Offline
Зарегистрирован: 12.02.2012

Это не с моим кодом ругается, а с ВАШИМ !!! Посмотрите что у вас написано в 41 строке и что у меня в 13 строке.

UPD:

double temp2 = Getterm(analogRead(2));  // считываем показания с сенсора 2
double temp = Getterm(analogRead(3));  // считываем показания с сенсора 2

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

ВНИМАТЕЛЬНЕЕ смотрим примеры кода или не лезем вообще в программирование - лучше поручите кому нибудь ,за денешку..

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

строка 41 вместо


double temp = Getterm(analogRead(3));  // считываем показания с сенсора 2

надо

double temp2 = Getterm(analogRead(3));  // считываем показания с сенсора 2

 

DizZ
Offline
Зарегистрирован: 04.12.2013

JollyBiber пишет:

строка 41 вместо


double temp = Getterm(analogRead(3));  // считываем показания с сенсора 2

надо

double temp2 = Getterm(analogRead(3));  // считываем показания с сенсора 2

 

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

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

На здоровье! Это я сегодня такой добрый. Обычно после моих советов мне тут морду набить грозятся. Хотя уже месяца 1,5 как никто не порывался. Попробуйте в следующий раз следовать таким правилам: четкое описание что должно быть на выходе, детальное оптсания используемого железа и самое главное помнить что Вам тут никто ничего не должен :) Ваши первые ответы я нахожу достаточно "пограничными" :)