Выполнение действий при определенной температуре или замыкания контактов

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Как сделать чтобы при температуре например 60градусов по цельсию отрабатывал на опреленный контакт

или при нажатии кнопки но при этом остальное тоже работало 

вот пока основа кода но планируется еще и создание меню с перелистыванием.  

#include <LiquidCrystalRus.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};

void setup() 
{
  lcd.createChar(0, newChar); 
  lcd.begin(16, 2);  
  numdevs = sensors.getDevices(); 
}

void loop() {
  value = (int) sensors.getTempC(0);
if (value != 85)
{
    if (value < 10)
    {
      temp = value/10;
    }
    else
    {
      temp = value;
    }
}
lcd.setCursor(0,0);
lcd.print("Tемпература=");
lcd.setCursor(12,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);
}

 

leshak
Offline
Зарегистрирован: 29.09.2011
loop(){
....
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);

if(temp==60){
  // отрабатываем определенный контакт
}

if(digitalRead(BUTTON_PIN)){
  // остальное тоже работает
}
....
}

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

А где вписывать какой пин за что отвечает

 

leshak
Offline
Зарегистрирован: 29.09.2011

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

Опросили, например, 18-тый пин. Что делать если он в high (или Low) - решать вам. Вот за это "что делать" он и будет "отвечать".

dronsoft
Offline
Зарегистрирован: 02.06.2011

 тоесть не понял как сделать исполнение если температура 60 то нужно включить пин 13 например а если падает то отключить пин 13

leshak
Offline
Зарегистрирован: 29.09.2011

 http://arduino.ru/Reference/Else

http://arduino.ru/Reference/DigitalWrite

P.S. "Ардуино не требует знание программирования" - маркетинговый миф.

dronsoft
Offline
Зарегистрирован: 02.06.2011

ок ща гляну

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

 вот пока без кнопки 

#include <LiquidCrystalRus.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
int ledPin = 13;
byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};

void setup() 
{
  lcd.createChar(0, newChar); 
  lcd.begin(16, 2);  
  numdevs = sensors.getDevices();
  pinMode(ledPin, OUTPUT);
}

void loop() {
  value = (int) sensors.getTempC(0);
if (value != 85)
{
    if (value < 10)
    {
      temp = value/10;
    }
    else
    {
      temp = value;
    }
if (temp>=31)
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  delay(1000);                  // ждет секунду
  digitalWrite(ledPin, LOW);    // выключает светодиод
  delay(1000);                  // ждет секунду

}
lcd.setCursor(0,0);
lcd.print("Tемпература=");
lcd.setCursor(12,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);
}
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 В чем смысл строчки 32? Температура 85 это действительно какое-то особое событие или  "приблудилось"?

В чем смысл строк 34-40? Что вы пытались этим добится?

Строка 45 и 47-мь зачем? Вы же, вроде, хотели "влючить если больше, выключить если меньше", а так у вас вышло "мигать если больше, ничего не делать если меньше".

dronsoft
Offline
Зарегистрирован: 02.06.2011

 Да согласен с 45-47 решил пока оставить добавил кнопку но у меня пошли прерывания с секундным интервалом

32 строка это тупо копипас с сайта только переделал пины под мой ник

вот код с кнопкой почему у неё идет прерывание сигнала? 

#include <LiquidCrystalRus.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
int ledPin = 13;
int ledPin2 =  9;
int buttonPin = 10;
int buttonState = 0;
byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};

void setup() 
{
  lcd.createChar(0, newChar); 
  lcd.begin(16, 2);  
  numdevs = sensors.getDevices();
  pinMode(ledPin, OUTPUT);
}

void loop() {
  value = (int) sensors.getTempC(0);
if (value != 85)
{
    if (value < 10)
    {
      temp = value/10;
    }
    else
    {
      temp = value;
    }
if (temp>=31)
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
  delay(1000);                  // ждет секунду
  digitalWrite(ledPin, LOW);    // выключает светодиод
  delay(1000);                  // ждет секунду

}
{
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin2, OUTPUT);     
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);   
}

lcd.setCursor(0,0);
lcd.print("Tемпература=");
lcd.setCursor(12,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);
}
{
  // считываем значения с входа кнопки
  buttonState = digitalRead(buttonPin);
 
  // проверяем нажата ли кнопка
  // если нажата, то buttonState будет HIGH:
  if (buttonState == HIGH) {   
    // включаем светодиод   
    digitalWrite(ledPin2, HIGH); 
  }
  else {
    // выключаем светодиод
    digitalWrite(ledPin2, LOW);
  }
}
}

 

dronsoft
Offline
Зарегистрирован: 02.06.2011

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

#include <LiquidCrystalRus.h>
#include <OneWire.h>
#include <OneWireTempSensor.h>

LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
OneWireTempSensor sensors(8); 
int numdevs;
int value;
int temp;
int ledPin = 13;
int ledPin2 =  9;
int buttonPin = 10;
int buttonState = 0;
byte newChar[8] = {
  B11000,
  B11000,
  B00110,
  B01001,
  B01000,
  B01001,
  B00110,
  B00000
};

void setup() 
{
  lcd.createChar(0, newChar); 
  lcd.begin(16, 2);  
  numdevs = sensors.getDevices();
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin2, OUTPUT);
}

void loop() {
  value = (int) sensors.getTempC(0);
if (value != 85)
{
    if (value < 10)
    {
      temp = value/10;
    }
    else
    {
      temp = value;
    }
if (temp>=31)
{
  digitalWrite(ledPin, HIGH);   // включает светодиод
}
if (temp<=26)
{
  digitalWrite(ledPin, LOW);
}

if (buttonState == HIGH) {
  digitalWrite(ledPin2, HIGH); 
  }
}
  else {
    // выключаем светодиод
    digitalWrite(ledPin, LOW);
  }
lcd.setCursor(0,0);
lcd.print("Tемпература=");
lcd.setCursor(12,0);
lcd.print(temp);
lcd.setCursor(14,0);
lcd.write(0);
}



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

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

leshak пишет:

 В чем смысл строчки 32? Температура 85 это действительно какое-то особое событие или  "приблудилось"?

85 - это то значение (в градусах Цельсия) теспературы, которое считывается с датчика (LSB = b'01010000', MSB = b'00000101') в случае неудачи с преобразованием (не выждали 750 мсек и т.п.)

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

leshak пишет:

 В чем смысл строчки 32? Температура 85 это действительно какое-то особое событие или  "приблудилось"?

85 - это то значение (в градусах Цельсия) теспературы, которое считывается с датчика (LSB = b'01010000', MSB = b'00000101') в случае неудачи с преобразованием (не выждали 750 мсек и т.п.)

Спасибо огромное. Действительно "тонкий нюанс". Сколько раз поднимались тут темы по работе с этими датчиками, а эта тонкость первый раз упомянулась. Причем, как я понял, это "полудокументированная фича", даташит говорит, мелким шрифтом, только "The power-on reset value of the temperature register is +85°C."

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

Типикстартеру: вообщем смысл стал понятен. Оставлять или эту проверку, в какой-то степени дело вкуса. Если "все хорошо работает", то, по идее, она никогда не должна влиять на скетч ( "выжидание 750 мсек" уже встроенно в библиотеку). Вообщем с одной стороны она вроде как-бы "захламляет скетч" и рука тенется ее убрать, с другой, конечно, "грамотный подход к программированию" требует что-бы код обрабатывал все возможные нештатные ситуации (то есть оставить). Лично я бы оставил, но добавил-бы к этому условию else в которое вписал вывод сообщения об ошибке (в Serial или LCD).

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

dronsoft пишет:

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

 

Ну что "лишнее что не лишние" - трудно сказать. Это вы как автор скетча должны знать что и зачем вы писали. Общий подход такой: нужно понимать что делает каждая строчка ВАШЕГО кода. Либо убирать, либо разбиратся "зачем оно тут". Мысленно в голове прокрутить "что они делают" и решить нужны они вам или нет.

Лично меня - больше всего смущают строки 39-46. С моей точки зрения они тут либо лишние (и промежуточная переменная value - тоже не нужна), либо неудачная попытка сделато что-то полезное (как-то по другому выводить температуру меньше 10).

По поводу оформления кода: как минимум нужно сделать отступы, что-бы можно было вменяемо читать и было видно какая закрывающая скобка к какой отрывающей отностися. Самому же легче будет. Вот, например, в строках 58-60-т, есть сильное подозрение что вы else приципили не к тому if-у которому хотели.

Далее: если "действие" которые выполняются в каком-то if состояет из одно строчки, то можно не оборачиваеть его фигурными скобками и вообще написать в одну строчку

if (temp>=31)digitalWrite(ledPin, HIGH);   // включает 

IMHO так код выглядить более читаемым, но это "дело вкуса".

Так же, учитывая ваши попытки вставить delay(), рекомендую посмотреть пример http://arduino.ru/tutorials/BlinkWithoutDelay

А вообще delay() нужно избегать по возможности. У него есть слишком непряитный "побочный эффект" - на нем скетч останавливается. И ничего не происходит (ни опроса кнопок, ни опроса датчиков, ни вывода отладочной информации)