Galera, boa tarde

Gostaria da ajuda de vocês, estou fazendo um projeto com os seguintes sensores  ( 03 ds18b20 e 2 swits )

Eu quero criar 3 floats para  tempS1,S2,S3(probe01 , probe02 e probe 03 ) e estabelecer uma condição que :

Vocês sabem me dizer como fazer isso atraves do deviceaddress ? os valores já estao sendo plotados em tempo real no display, ou seja, o codigo até ai está ok,

só preciso fazer esse tipo de comparação..

if( tempS1 && tempS2 && tempS3 > 26 )
{
  digitalWrite( pinobuzzer, HIGH );
  delay(2000);
  digitalWrite( pinobuzzer, LOW );
  }
  else {
  digitalWrite( pinobuzzer, LOW );
  }
   delay(50);

Segue codigo:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>



#define ONE_WIRE_BUS 3



OneWire oneWire(ONE_WIRE_BUS);
const int pinobuzzer = 2;
 
DallasTemperature sensors(&oneWire);
DeviceAddress Probe01 = { 0x28, 0xFF, 0x52, 0x4C, 0x01, 0x15, 0x04, 0x75 };
DeviceAddress Probe02 = { 0x28, 0xFF, 0x4A, 0x45, 0xA4, 0x15, 0x01, 0x58 };
DeviceAddress Probe03 = { 0x28, 0xFF, 0x1D, 0x83, 0xA4, 0x15, 0x01, 0xAC };

// Inicializa o LCD
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);



void setup()   /****** SETUP: RUNS ONCE ******/
{
//------- Initialize the Temperature measurement library--------------
  Serial.begin(9600);
  sensors.begin();
  // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
//---------------- Initialize the lcd ------------------  
  lcd.begin (16,2);  

}


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  sensors.requestTemperatures(); // Send the command to get temperatures

  lcd.clear();  // Reset the display  
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("1:");
  displayTemperature(Probe01);  
 
  lcd.setCursor(9,0); //Start at character 0 on line 1
  lcd.print("2:");
  displayTemperature(Probe02);

  lcd.setCursor(0,1); //Start at character 0 on line 1
  lcd.print("3:");
  displayTemperature(Probe03);
 
 
 
 
  delay(2000);

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
void displayTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) // Measurement failed or no device found
   {
    lcd.print("Temperature Error");
   }
   else
   {
   lcd.print(tempC);
   }

  if( tempC > 26 ) {
  digitalWrite( pinobuzzer, HIGH );
  delay(2000);
  digitalWrite( pinobuzzer, LOW );
  }
  else {
  digitalWrite( pinobuzzer, LOW );
  }
   delay(50);
 
}// End printTemperature

//*********( THE END )***********
Desde já agradeço pela ajuda, obrigado.

Exibições: 388

Responder esta

Respostas a este tópico

Na hipótese de ter 3 variaveis (S1 ,S2 ,S3).

Caso queira verificar se algumas delas é maior que 25,proceda:

if ( (S1) | | (S2) | | (S3)  > 25 )  //somente se ALGUMA DELAS for maior que 25

{

faça();

}

Caso deseja que somente quando todas sejam maior que 25,proceda:

if ( (S1) && (S2) && (S3)  > 25 )  //somente se TODAS forem maior que 25

{

nao_faça();

}

visite meus projetos em http://adltecnologia.blogspot.com.br

Almir, primeiramente gostaria de lhe agradeçer pela sua contribuíçao , a condição sitada eu estou ciente, porém preciso armazenar esses valores antes, para posteriormente compara-los, esse codigo que postei acredito que ele faz a leitura da temperatura e printa na tela ( somente )..

O que preciso é de criar 3 variaaveis tipo float temps1 , temps2, temps3 e obter as temperaturas de probe01 para temps1 , probe02 para temps2 e etc,

Essa parte é que estou meio perdido.. Desde já agradeço sua contribuição e de quem mais quiser contribuir,


Obrigado

André sempre que você estiver utilizando um código que você não tenha escrito é muito importante que você entenda cada instrução dentro desse código. Digo isso pois o que você quer ja está dentro do seu código, você só precisa "tirar de um lugar e colocar no outro".

A sua função displayTemperature possui na variável tempC o valor da temperatura correspondente ao deviceAddress que você envia como paramento. O que você pode fazer para salvar esse dado em outra variável e ter ele como um retorno, para isso substitua o 'void' da sua função por 'float' (já que esse é o tipo da variável que você quer usar) e no final do código da função coloque return tempC;

Para chamar a função, substitua o displayTemperature(Probe01); por temps1 = displayTemperature(Probe01); (claro, faça o mesmo para temps2 e temps3 utilizando Probe02 e Probe03)

Explicação rapida: void significa função sem retorno, ao substituir por float significa que sua função passa a ter um retorno do tipo float. A instrução return tempC indica que ao finalizar a sua função ela irá retornar o valor contido em tempC (que é um float). Ao utilizar temps1 = displayTemperature(Probe01); você define que a variável temps1 irá receber o retorno da função displayTemperature(Probe01), que é o valor de tempC

João, peço desculpas pela minha ignorância.

Traduzindo o que você falou , ficaria assim ?

float loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  sensors.requestTemperatures(); // Send the command to get temperatures

  lcd.clear();  // Reset the display  
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("1:");
  temps1 = displayTemperature(Probe01);
 
  lcd.setCursor(9,0); //Start at character 0 on line 1
  lcd.print("2:");
  temps2 = displayTemperature(Probe02);
 
  lcd.setCursor(0,1); //Start at character 0 on line 1
  lcd.print("3:");
  temps3 = displayTemperature(Probe03);

  return tempC;
 
  delay(2000);

Obrigado desde já

Não precisa pedir desculpa, aqui é um lugar para aprender mesmo.

As alterações de void para float e o return tempC deve ser feitas na função displayTemperatura e não na função loop.

A parte do temps1, temps2 e temps3 estão corretas

No link abaixo fiz as alterações no seu código original, da uma olhada e se tiver alguma duvida pode perguntar

http://pastebin.com/dvFksVHm

Obs.: não testei o código, caso apresente algum erro me avisa.

João , compilou e carregou normal


Porém a função abaixo esta funcionando ( quando s3 atinge mais de 26 ele ja ativa, mesmo quando s1 e s2 esteja abaixo desse valor ) , amanhã vou verificar com mais calma ...

if( (temps1)&&(temps2)&&(temps3)  > 26 ) {
  digitalWrite( pinobuzzer, HIGH );
  delay(2000);
  digitalWrite( pinobuzzer, LOW );
  }
  else {
  digitalWrite( pinobuzzer, LOW );
  }
   delay(50);

Mas acredito que você me ajudou muito , obrigado mesmo .

não está funcionando **

Pessoal esse IF está errado. Não se pode fazer desse jeito. É um  erro grave. Vai dar certo em alguns casos por coincidência.

if( (temps1)&&(temps2)&&(temps3)  > 26 )

O certo é fazer assim:

if( (temps1 > 26) && (temps2 > 26) && (temps3  > 26) )

O uso dos parênteses internos é opcional.

Nesse caso, se as 3 temperaturas forem maiores que 26, a expressão vai ser verdadeira.

Se você quiser que apenas uma já satisfação a condição, então deve ser feito assim:

if( (temps1 > 26) || (temps2 > 26) || (temps3  > 26) )

Jose Augusto Cintra e João Arthur Arcângelo Alonso , agradeço demais a ajuda de vocês, quando eu finalizar 100% do projeto coloco por aqui e você saberão que fizeram parte dele. Desde já meus sinceros agradecimentos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço