Pessoal, Estou com um probleminha no meu projeto
Ele consiste em medir a temperatura interna com 3 sensores e fazer a média "tmed"
esse valor deve ser comparado com a temperatura externa "t1"
se a Diferença da média das temperaturas interna com a externa "(tmed - t1)" for menor que 10°C
o buzzer deve ser acionado
e se a umidade média "hmed" for menor que 50% o buzzer deve ser acionado.
Nesse sketch não consigo acionar o buzzer..os comandos estão certinho tanto é que fiz outro sketch com 2 DHT11 fiz a variação e temperatura e funcionou perfeito.
Acho que tá tendo algum conflito, pois nesse sketch o mesmo comando não funciona.
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#define DHT1PIN 10 // Sensor externo 
#define DHT2PIN 12
#define DHT3PIN 9
#define DHT4PIN 8
#define DHTTYPE DHT11 // tipo de sensor DHT 11 
#define DS1307_ADDRESS 0x68
byte zero = 0x00; 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); 
                
DHT dht1(DHT1PIN, DHTTYPE); 
DHT dht2(DHT2PIN, DHTTYPE); 
DHT dht3(DHT3PIN, DHTTYPE);
DHT dht4(DHT4PIN, DHTTYPE);
void setup() {
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht1.begin(); 
  dht2.begin();
  dht3.begin();
  dht4.begin();
  pinMode(13,OUTPUT);  //Buzzer
  //setDateTime(); 
}
void loop() {
  printDate();
  printsensor();
}
void setDateTime(){
  byte second =      45; //0-59
  byte minute =      15; //0-59
  byte hour =        21; //0-23
  byte weekDay =     3; //1-7
  byte monthDay =    18; //1-31
  byte month =       10; //1-12
  byte year  =       14; //0-99
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start 
  Wire.endTransmission();
}
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}
void printDate(){
  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  //print the date EG   3/1/11 23:59:59
  Serial.print(monthDay);
  Serial.print("/");
  Serial.print(month);
  Serial.print("/");
  Serial.print(year);
  Serial.print(" ");
  Serial.print(hour);
  Serial.print(":");
  Serial.print(minute);
  Serial.print(":");
  Serial.print(second);
}
void printsensor(){
  int h1 = dht1.readHumidity(); //umidade externa
  int t1 = dht1.readTemperature(); //temperatura externa
  int h2 = dht2.readHumidity(); 
  int t2 = dht2.readTemperature(); 
  int h3 = dht3.readHumidity(); 
  int t3 = dht3.readTemperature(); 
  int h4 = dht4.readHumidity(); 
  int t4 = dht4.readTemperature(); 
  int hmed = ((h2 + h3 + h4)/3); //media da umidade interna
  int tmed = ((t2 + t3 + t4)/3); //media da temperatura interna
  int tdif = (tmed - t1); //diferença da temperatura interna com a externa
  
  if (tdif<10)
{
  digitalWrite(13,HIGH);
}
else
{
  digitalWrite(13,LOW);
}
  if (hmed<50)
{
  digitalWrite(13,HIGH);
}
else
{
  digitalWrite(13,LOW);
}
  Serial.print("   ");
  Serial.print(h1);
  Serial.print(" ");
  Serial.print(h2);
  Serial.print(" ");
  Serial.print(h3);
  Serial.print(" ");
  Serial.print(h4);
  Serial.print(" ");
  Serial.print(t1);
  Serial.print(" ");
  Serial.print(t2);
  Serial.print(" ");
  Serial.print(t3);
  Serial.print(" ");
  Serial.print(t4);
  Serial.print(" ");
  Serial.print(hmed);
  Serial.print(" ");
  Serial.print(tmed);
  Serial.print(" ");
  Serial.println(tdif);
  delay(2000);
lcd.setCursor(0,0);
lcd.print("INT:");
lcd.setCursor(5,0);
lcd.print("T");
lcd.setCursor(6,0);
lcd.print(tmed);
lcd.setCursor(8,0);
lcd.print((char)223);
lcd.setCursor(9,0);
lcd.print("C");
lcd.setCursor(11,0);
lcd.print("Um");
lcd.setCursor(13,0);
lcd.print(hmed);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("EXT:");
lcd.setCursor(5,1);
lcd.print("T");
lcd.setCursor(6,1);
lcd.print(t1);
lcd.setCursor(8,1);
lcd.print((char)223);
lcd.setCursor(9,1);
lcd.print("C");
lcd.setCursor(11,1);
lcd.print("Um");
lcd.setCursor(13,1);
lcd.print(h1);
lcd.setCursor(15,1);
lcd.print("%");
}

Exibições: 412

Responder esta

Respostas a este tópico

acho que vc deve fazer um map do desse valor pra entao o seu if ter efeito

O buzzer que não faz barulho ou se vc colocar um led no lugar da buzina ele tb não acende?

Outra coisa, tem uma divisão por 3 no cálculo da média para numero inteiro e isto não é uma boa prática. Se tiver memória, tenta trocar hmed e tmed para float ao invés de inteiro. Ou então tenta assim:

int hmed =(int) ( (h2 + h3 + h4)/3 ); //media da umidade interna

int tmed =  (int) ( (t2 + t3 + t4) / 3 ); //media da temperatura interna

Caro Lívio, o problema seu parece que é o seguinte:

int tdif = (tmed - t1); //diferença da temperatura interna com a externa

  
  if (tdif<10)
{
  digitalWrite(13,HIGH);
}
else
{
  digitalWrite(13,LOW);
}
  if (hmed<50)
{
  digitalWrite(13,HIGH);
}
else
{
  digitalWrite(13,LOW);
}
Pois você tem dois eventos acionando  ou desativando ao mesmo tempo. Se você aciona com HIGH, i.e.
digitalWrite(13, HIGH);
COLOQUE UM DELAY para dar tempo de ouví-lo, por exemplo:
{
 digitalWrite(13,HIGH);
 delay(2000);     // para dois segundos se necessário
}

Outra coisa, se você me permite, eu acho estranho que você não tenha pensado em criar um semáforo de pânico quando as situações emergenciais ocorrerem e no programa principal você teria chance de resolver a situação. Por exemplo:

#define NORMAL 0

#define TEMPBAIXA 1

#define HUMIDADEBAIXA 2

#define TEMPOESPERA 2000

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

byte panicFlag = NORMAL;

// Em printsensor()

if (tdif<10)

{
  //digitalWrite(13,HIGH);
  panicFlag  |= TEMPBAIXA;
 
}
//else
//{
 // digitalWrite(13,LOW);
//}
  if (hmed<50)
{
  //digitalWrite(13,HIGH);
  panicFlag |= HUMIDADEBAIXA;
}
//else
//{
  //digitalWrite(13,LOW);
//}

// Já no loop faria assim:

void loop() {
  printDate();
  printsensor();
  if(panicFlag !=NORMAL)
   {
     acioneBuzzer();
     panicFlag = NORMAL;
   }
}
// CRIE TAMBÉM A FUNÇÃO acioneBuzzer()
void acioneBuzzer()
 {
   if(panicFlag & TEMPBAIXA)
    {
      // ação para temperatura baixa
      digitalWrite(13,HIGH);
      delay(TEMPOESPERA);
    }
  if((panicFlag & HUMIDADEBAIXA)
   {
    // ação para humidade baixa
    digitalWrite(13,HIGH);
    delay(TEMPOESPERA);
   }
 }
S.M.J.
Obrigado,
Professor Almir
Caro Lívio, mais uma coisa:
Se você está querendo gerar um certo tom num buzzer, pelo o que eu sei, você tem que gerar a frequência do tom, usando, por exemplo uma onda quadrada de altos e baixos. Se você não for muito exigente com o tom, use uma porta com pwm para conseguir seu intento. Além disso a corrente máxima de uma porta num arduino tipo uno é de no máximo 40mA. Caso precise mais use um transistor para amplificá-la.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço