3 módulos em um só arduino

Srs
Boa noite...estou tentando montar uma cortina para galinheiro...preciso que seja automatizada, utilizando 3 módulos (rtc(hora marcada), sensor de chuva e sensor de temperatura)...consigo fazer isso em uma placa só?? ...na verdade eu consegui acionar o motor(ligado em uma ponte H) por cada um desses módulos individualmente, mas não estou conseguindo juntar os sckets, de forma que funcione...podem me ajudar??
grato

Boa noite,
sim, voce consegue ligar um RTC, sensor de chuva e sensor de temperatura em um arduino UNO/Mini/Nano, ou ESP8266 ou ESP32.

Para que possamos ajuda-lo, recomendo que voce poste os seus códigos.
Para isto, faça da maneira recomendada pelo forum.
Click em " < code > " na barra de ferramentas e então cole o seus códigos entre as tags que aparecem.
Cole os códigos que voce quer juntar.
É fortemente recomendado que voce também poste um esquemático do seu projeto.

Assim procedendo você nos ajuda a ajuda-lo.

1 Like
#include <LiquidCrystal.h>
#include <Thermistor.h>
#include <WireData.h>
#include <DS3231.h>

// --- Declaração de Objetos ---
DS3231  rtc(SDA, SCL);
Thermistor temp(1);
LiquidCrystal lcd(12,11,5,4,3,2);
Time t;
int horas, ano, minutos;

const int HoraAbre    = 20;
const int MinutoAbre  = 1;
const int HoraFecha   = 20;
const int MinutoFecha = 3;

#define pinMotor1 9
#define pinMotor2 10
#define pinSensorC 7 
#define pinSensorB 6
#define min min

int estado;   //0=fechado   1=aberto   2=fechando   3=abrindo

void setup() {
 lcd.begin (16,2); //Define o numero de colunas e  linhas do LCD
  Serial.begin(115200);          //Inicia comunicações Serial em 115200 baud rate
 
  rtc.begin();                   //Inicializa RTC
  
  //Descomente as linhas a seguir para configurar o horário, após comente e faça o upload novamente para o Arduino
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(8,21, 20);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(25,11,2023);

   
  pinMode(pinMotor1, OUTPUT);
  pinMode(pinMotor2, OUTPUT);
  pinMode(pinSensorE, INPUT);
  pinMode(pinSensorD, INPUT);
  
}

void loop() {
   int temperatura = temp.getTemp();
    t = rtc.getTime();
  horas   = t.hour;
  minutos = t.min;
  ano     = t.year;

  lcd.clear (); // Limpa a tela do lcd

 lcd.setCursor (0,0); // Posiciona o cursor na 1 coluna e linha 1
 lcd.print ("Temp: "); //Envia o texto entre as aspas para o LCD
   Serial.print ("temperatura: ");
   
 lcd.setCursor (6,0); // posiciona o cursor na 7 coluna e linha 1
 lcd.print (temperatura);
   Serial.print (temperatura);
  
 lcd.setCursor (8,0); // posiciona o cursor na 9 coluna e linha 1
 lcd.print ("C");
   Serial.println ("C");

  Serial.print(horas);
  Serial.print("   ");
  Serial.print(minutos);
  Serial.print("   ");
  Serial.print(ano);
  Serial.print("   ");
  //Imprime o dia da semana
  //Serial.print(rtc.getDOWStr());
  Serial.print(rtc.getDateStr());
  Serial.print(" ");
  Serial.print(" -- ");
  Serial.print(" ");
   
  //Imprime o horário
  Serial.println(rtc.getTimeStr());
   
  //Atualiza monitor a cada segundo
  delay (1000);

  bool estaDireita = !digitalRead(pinSensorD);
  bool estaEsquerda = !digitalRead(pinSensorE);

  //PARTE 1 - Controle do estado
  if ((t.hour == HoraAbre) && (t.min == MinutoAbre)) {
     if (estaDireita) {
        estado = 1;
     } else {
        estado = 3;
     }

  } else 
  if ((t.hour == HoraFecha) && (t.min == MinutoFecha)) {
     if (estaEsquerda) {
        estado = 0;
     } else {
        estado = 2;
 
        
  }
}
  //PARTE 2 - Execução do estado
  switch (estado) {
    case (0): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (1): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (2): //fechando
      digitalWrite(pinMotor1, HIGH);
      digitalWrite(pinMotor2, LOW);
      break;
    case (3): //abrindo
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, HIGH);
      break;
   }


delay(10); 

}

#include <Thermistor.h>
#include <LiquidCrystal.h>

Thermistor temp(1); // Porta analogica 0 ; temp (nome qualquer)
LiquidCrystal lcd(12,11,5,4,3,2);

#define pinMotor1 9
#define pinMotor2 10
#define pinSensorE 7 
#define pinSensorD 6

int estado;   //0=fechado   1=aberto   2=fechando   3=abrindo


void setup() {
 lcd.begin (16,2); //Define o numero de colunas e  linhas do LCD
  Serial.begin (9600);
  pinMode(pinMotor1, OUTPUT);
  pinMode(pinMotor2, OUTPUT);
  pinMode(pinSensorE, INPUT);
  pinMode(pinSensorD, INPUT);
}

void loop() {
  int temperatura = temp.getTemp(); // "Basicamente pega a temperatura , converte a tensão para Graus C°"

 // Posicionando o cursor e mostrando o texto
 
 lcd.clear (); // Limpa a tela do lcd

 lcd.setCursor (0,0); // Posiciona o cursor na 1 coluna e linha 1
 lcd.print ("Temp: "); //Envia o texto entre as aspas para o LCD
   Serial.print ("temperatura: ");
   
 lcd.setCursor (6,0); // posiciona o cursor na 7 coluna e linha 1
 lcd.print (temperatura);
   Serial.print (temperatura);
  
 lcd.setCursor (8,0); // posiciona o cursor na 9 coluna e linha 1
 lcd.print ("C");
   Serial.println ("C");


 delay (3000); //Espera 3 segundos

  bool estaDireita = !digitalRead(pinSensorD);
  bool estaEsquerda = !digitalRead(pinSensorE);

  //PARTE 1 - Controle do estado
  if (temperatura > 18 ) {
     if (estaDireita) {
        estado = 1;
     } else {
        estado = 3;
     }

  } else 
  if (temperatura < 18) {
     if (estaEsquerda) {
        estado = 0;
     } else {
        estado = 2;
     }
  }
  //PARTE 2 - Execução do estado
  switch (estado) {
    case (0): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (1): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (2): //fechando
      digitalWrite(pinMotor1, HIGH);
      digitalWrite(pinMotor2, LOW);
      break;
    case (3): //abrindo
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, HIGH);
      break;
  }
  delay(10);

}

#define pinSensorA A0
#define pinSensorD 8
#define pinMotor1 9
#define pinMotor2 10
#define pinSensorC 7 
#define pinSensorB 6

int estado;   //0=fechado   1=aberto   2=fechando   3=abrindo


void setup() {
 
  Serial.begin(9600);
  pinMode(pinSensorD, INPUT);
  pinMode(pinMotor1, OUTPUT);
  pinMode(pinMotor2, OUTPUT);
  pinMode(pinSensorC, INPUT);
  pinMode(pinSensorB, INPUT);

}

void loop() {
   Serial.print("Digital:");
  
  bool estaDireita = !digitalRead(pinSensorC);
  bool estaEsquerda = !digitalRead(pinSensorB);

  if (digitalRead(pinSensorD)) {
     Serial.print("SEM CHUVA ");
  } else {
     Serial.print("ESTA CHUVENDO ");
  }

  Serial.print("  Analogico:");
  Serial.print(analogRead(pinSensorA)); 
  Serial.print("  ");

  Serial.print("  Atuador:");
  if (analogRead(pinSensorA) > 700) {
     Serial.println("TOLDO ABERTO");
     if (estaDireita) {
        estado = 1;
     } else {
        estado = 3;
     }

  } else 
  if (analogRead(pinSensorA) < 700){
    Serial.println("TOLDO FECHADO");
    if (estaEsquerda) {
        estado = 0;
     } else {
        estado = 2;
     }
  }

//PARTE 2 - Execução do estado
  switch (estado) {
    case (0): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (1): //parado
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, LOW);
      break;
    case (2): //fechando
      digitalWrite(pinMotor1, HIGH);
      digitalWrite(pinMotor2, LOW);
      break;
    case (3): //abrindo
      digitalWrite(pinMotor1, LOW);
      digitalWrite(pinMotor2, HIGH);
      break;
  }
  delay(10);
}


O esquema do projeto eu não consigo...

...esqueci de dizer antes
"A cortina do galinheiro fecha às 18hs e permanece fechada até às 06h da manhã, quando abre...o sensor de chuva e o sensor de temperatura só funcionarão entre 06h01min da manhã e 17h59min...

Como falei, esses códigos individualmente estão funcionando...mas quando tento juntá-los, não funciona...

Desculpe, estou começando agora...tanto na programação quanto aqui no fórum
Grato sempre

Como existem varias bibliotecas usando o mesmo nome, post o link das bibliotecas que voce usou no seu projeto para que possa usar as mesmas nos testes.

PS:

  1. É importante um esquemático do seu projeto, pois se voce não tem experiência com eletrônica pode cometer erros que danificarão seu componente, (Arduino, módulos etc).

Desenhe um, mesmo que seja a mão livre e poste aqui.

  1. Qual o modulo que está usando para mover o motor?

  2. // Cortina fecha as 18:00;
    // Cortina abre as 6:00;
    // Sensores só funcionam entre 6:01 e 17:59;
    // Se chove fecha cortina;
    // Se não chove abre a cortina;
    // Temp. > 18 C abre cortina;
    // temp. < 18 C fecha cortina.
    Está correto?
    E se for = 18 C?

  3. O que vai ligado em cada sensor?
    pinSensorA
    pinSensorB
    pinSensorC
    pinSensorD
    pinSensorE

  4. Voce disse :

Mas já o primeiro codigo da vários erros de compilação:

sketch_nov30a:40:11: error: 'pinSensorE' was not declared in this scope

   pinMode(pinSensorE, INPUT);

sketch_nov30a:41:11: error: 'pinSensorD' was not declared in this scope

   pinMode(pinSensorD, INPUT);

Boa noite!

Obrigado pela ajuda...

Tentei enviar um anexo do esquema do projeto, mas como sou novato por aqui, a plataforma não me permitiu.

Vamos lá
1. Esse erro de compilação, foi porque esqueci de alterar de pinSensorE para pinSensorC, e de pinSensorD para pinSensorB.

2. As bibliotecas que estou utilizando são

Thermistor

WireData

DS3231

A biblioteca LiquidCrystal, apesar de estar inclusa(pois já estava no sketch), não a estou utilizando, por não utilizar o Lcd 16X2.

Essas bibliotecas foram instaladas através da própria IDE do arduino, em gerenciar bibliotecas.

3. O módulo para o motor, é uma Ponte H L298 ;

Cortina fecha as 18:00;
Cortina abre as 6:00;
Sensores só funcionam entre 6:01 e 17:59;
Se chove fecha cortina;
Se não chove abre a cortina;
temp. ≥ 18 C abre cortina;
temp. < 18 C fecha cortina.
Agora sim.


4. Os pinos do arduino são o seguinte:

pinMotor1 (vem da ponte H)- Ligado no digital 9;

pinMotor2 (vem da ponte H)- Ligado no digital 10;

pinSensorC (Sensor de fim de curso-parte de cima)-Ligado no digital 7;

pinSensorB (Sensor de fim de curso-parte de baixo)-Ligado no digital 6;


O Sensor de Chuva

pinSensorD (Sensor de chuva)-Ligado no digital 8;

pinSensorA (Sensor de chuva)-Ligado no Analógico 0 (A0);


O Thermistor(sensor de temperatura) - Ligado no Analógico 1 (A1);

O Rtc DS3231, é ligado nas portas SDA e SCL(Analógicos A4 e A5, respectivamente).


Grato

Acho que voce não entendeu a minha pergunta do item 2.

O nome das bibliotecas eu sei pois estão nos códigos,
mas o que eu quero é o link de onde voce baixo estas bibliotecas, para baixar igual.
Pois existem varias bibliotecas que agem de modo diferente mas as vezes tem o mesmo nome.
Por exemplo a biblioteca DS3231.h pode ser baixada de :
" GitHub - NorthernWidget/DS3231: Communicates between Arduino-programmed AVR and Maxim DS3231 RTC: splice of Ayars' (http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html) and Jeelabs/Ladyada's (https://github.com/adafruit/RTClib) libraries
ou de
DS3231 - Rinky-Dink Electronics

E elas tem comandos diferente, e dependendo da que voce está usando, se eu usar a outra vai dar erro de compilação.
Entendeu?

Poste o link de todas bibliotecas que voce baixou para usar neste projeto.

Porque voce usa a saída digital e a saída analógica do sensor de chuva?

A saída digital está ajustada para ligar com qual "nível" de chuva?

Bom dia!
Desculpe. Agora entendi.
DS3231
https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa0E2U1ZhaWFfQUVQQkJ2dHdsUnN0ek9xNjMxd3xBQ3Jtc0tsdEtZZ01jNm8xVDdHTlBMT3JrQ1ZyYVJnbEQyMnpfbC1BRzFHbVNNWmN1Vm1ONEhxcURlR3RicGl3Q0JhYndvTng2VWJGV1MzcERKc1FHc1NuZ2NjeVBUOVMtMHRobXpVUUlrVU1wZGYyZUJSNTNkdw&q=http%3A%2F%2Fwww.rinkydinkelectronics.com%2Flibrary.php%3Fid%3D73&v=B0BjyWqZY9o

Thermistor
https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbG9pODRrc3dhRElGUExZMWxNR3otUEQ2ZUM1UXxBQ3Jtc0ttYzNuZkN5QXV3UlFpYmpuYkk4Rmw0SE5rWHBjYmx3WW54UHR5SHY5Um5LQ2d5UzVlVWFjUHg0bEFBc19kSVQtSHZiTURoYjhHc0VwU2JCZTVjMk5EbFRFeDFTa3RrTlJzR3k1bmtjMjdFWHJZLVBBYw&q=https%3A%2F%2Fwww.mediafire.com%2Ffile%2Fh3v088x1zrghgad%2FTermometro%2Bcom%2Bacionamento%2Bautomatico.rar&v=Ijw6NJ-SR7M

Wiredata
https://github.com/bhagman/WireData.git

O Porque de usar a saída digital e a saída analógica do sensor de chuva, bem como o "nível" de chuva que a saída digital está ajustada para ligar, eu não sei te responder.
O sensor de chuva poderia funcionar apenas com a saída analógica??
Se sim, vamos desligar a digital.

Obrigado 

@dhun

Veja se este codigo atende sua necessidade.
Veja que usei outra biblioteca de DS321, pois a sua era muito antiga.
O link da nova biblioteca está no codigo, na frete da inclusão dela.
Baixa esta nova.
Sobre os sensores de fim de curso do motor não sei se estão corretos.
Senão estiver corrija.
O acerto do relógio está comentado pois só é necessário para o ajuste inicial.
Tem também uma serie de impressões comentadas, mas só precisa para debug.

Depois conta o resultado.

/*Cortina fecha as 18:00;
  Cortina abre as 6:00;
  Sensores só funcionam entre 6:01 e 17:59;
  Se chove fecha cortina;
  Se não chove abre a cortina;
  temp. ≥ 18 C abre cortina;
  temp. < 18 C fecha cortina.

  pinMotor1 (vem da ponte H)- Ligado no digital 9;
  pinMotor2 (vem da ponte H)- Ligado no digital 10;
  pinSensorC (Sensor de fim de curso-parte de cima)-Ligado no digital 7;
  pinSensorB (Sensor de fim de curso-parte de baixo)-Ligado no digital 6;
  pinSensorD (Sensor de chuva)-Ligado no digital 8;
  pinSensorA (Sensor de chuva)-Ligado no Analógico 0 (A0);
  O Thermistor(sensor de temperatura) - Ligado no Analógico 1 (A1);
*/

//************************************ Codigo 3 ******************************

/* Fluxograma:
  Checa temperatura, chuva analogica fim de cursoCima  fim de curos baixo, horario.
*/
#include "Thermistor.h"  //https://blogmasterwalkershop.com.br/arquivos/libs/Thermistor.zip
//                         https://github.com/ItKindaWorks/libraries/tree/master/Thermistor
#include <DS3231.h>      //https://github.com/NorthernWidget/DS3231

#define chuvaA A0
#define Motor1 9
#define Motor2 10
#define cimaFC 7
#define baixoFC 6

RTClib myRTC;
DateTime now;
Thermistor termico(1);  // Porta analogica 0 ; temp (nome qualquer)

bool toldo = false;
byte hora = 0;          // Hora atual
byte minuto = 0;        // Minuto atual
int chuva = 0;          // Valor de  leitura para sensor de chuva
int temperatura = 0;    // Define a variavel para temperatira
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(115200);
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(cimaFC, INPUT_PULLUP);
  pinMode(baixoFC, INPUT_PULLUP);
  //myTimeSet();
  //myTimeNow();
}
//-----------------------------------------------------------------------------
void loop() {
  temperatura = termico.getTemp();      // Basicamente pega a temperatura , converte a tensão para Graus C°"
  chuva = analogRead(chuvaA);
  now = myRTC.now();
  hora = now.hour();
  minuto = now.minute();
  // Imprime somente para debug
  //Serial.print(hora); 
  //Serial.print(":"); 
  //Serial.print(minuto);
  //Serial.print("  chuva "); 
  //Serial.print(chuva);
  //Serial.print("  Temp "); 
  //Serial.print(temperatura);
  
  if (hora >= 18) {                         // Fecha toldo
    toldo = false;                          // Fecha toldo
  }
  if (hora >= 6 and hora < 18) {            // Abre toldo
    if (chuva < 700 ) toldo = false;        // Fecha toldo
    if (chuva >= 700 ) {
      if (temperatura >= 18)  toldo = true; // Abre toldo
      if (temperatura < 18)  toldo = false; // Fecha toldo
    }
  }
  //Serial.print("  toldo "); Serial.println(toldo);
  if (toldo == false) {                     // Fecha toldo
    if (digitalRead(cimaFC) == HIGH) {      // Motor n fechou
      digitalWrite(Motor1, HIGH);           // fechando
      digitalWrite(Motor2, LOW);            // fechando
    }
    else {
      digitalWrite(Motor1, LOW);            // parado
      digitalWrite(Motor2, LOW);            // parado
    }
  }

  if (toldo == true) {                      // Abre toldo
    if (digitalRead(baixoFC) == HIGH) {     // Motor n abriu
      digitalWrite(Motor1, LOW);            // abrindo
      digitalWrite(Motor2, HIGH);           // abrindo
    }
    else {
      digitalWrite(Motor1, LOW);            // parado
      digitalWrite(Motor2, LOW);            // parado
    }
  }
  delay(500);
}
//-----------------------------------------------------------------------------
void myTimeSet() {
  DS3231 myRTC;
  myRTC.setClockMode(false);  // set to 24h
  myRTC.setYear(23);
  myRTC.setMonth(12);
  myRTC.setDate(01);
  myRTC.setHour(17);
  myRTC.setMinute(22);
  myRTC.setSecond(28);
}
//-----------------------------------------------------------------------------
void myTimeNow() {
  now = myRTC.now();
  Serial.print(now.year(), DEC);    Serial.print('/');
  Serial.print(now.month(), DEC);   Serial.print('/');
  Serial.print(now.day(), DEC);     Serial.print(' ');
  Serial.print(now.hour(), DEC);    Serial.print(':');
  Serial.print(now.minute(), DEC);  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
}
1 Like

Olá
Bom dia!

Obrigado mais uma vez pela atenção.
Fico realmente muito feliz pela oportunidade de aprender sempre.

Estou ainda testando, mas funcionou sim.

O único problema é que está travando com a comunicação serial. Se testo como se houvesse chuva, ou se como a temperatura estivesse abaixo de 18º, se eu não ativar e/ou desativar o monitor serial, o sistema não funciona...

ativando o monitor serial, consigo ler as informações e daí a pouco, trava tudo, inclusive as informações do monitor são paradas(travadas)...

Eu não montei o projeto fisicamente aqui na minha bancada, mas usei o simulador WOKWI para testa-lo.
Dificuldades com o simulador:
Ele não tem o modulo L298, Usei LEDs azul e amarelo no lugar do "motor";
Ele não tem Sensor de chuva, usei um potenciômetro para simular o modulo de chuva;
Com o mouse no potenciômetro ajusta para o valor que voce quer;
No lugar de sensor de fim de cursos usei 2 chaves reversíveis;
O Sensor de temperatura é meio maluco, se voce clica nele aparece um valor na tela mas ao ajustar para o valor que voce quer aparece outro valor impresso. Não sei se é maluquice desta biblioteca thermistor ou do WOKWI.

1 Like

Então, essa também foram as minhas dificuldades; estava montando meu projeto no tinkercad, mas faltam muitos componentes, e eu não tenho conhecimento bastante para substituí-los.

mas o código ficou bacana, a lógica e os comandos;
só preciso entender o porque do travamento, e tentar corrigí-lo;
Olhei algumas postagens sobre isso, mas não entendi muito; vou ler novamente, estudar mais um pouco, quem sabe eu consigo.

Grato

Use o recurso de println() em determinados locais para saber por onde o codigo passou e assim debugar o travamento.

Fiz alguns outros testes aqui...imagino que o travamento não seja o código.
Quando o sistema é alimentado apenas pelo cabo USB do computador, o sistema não trava; testei tanto o thermistor quanto o sensor de chuva; as rolagens no monitor serial estão ok; ocorre que o motor é 12v, e então preciso de uma alimentação de uma fonte de 12v; e aí quando ligo a fonte, o travamento começa;

É um UNO?
Voce está alimentando o Arduino com 12 V?

Cuidado, pois o regulador interno do arduino,(AMS1117). pode aquecer muito quando o arduino é alimentado com 12V.

O problema é que o regulador de voltagem interno pode estar esquentando muito.
Põe seu dedo sobre o regulador e veja se está muito quente quando trava.

E se insistir pode danificar ou o regulador ou o arduino.

Uma conta simples: O regulador interno fornece 5V na saída, então se voce alimentar o
arduino com 12V, a queda de tensão no regulador será de 7V.
Se a corrente total consumida por seu arduino mais os módulos for por exemplo de 300mA então o regulador vai "gerar" 7 * 0,3 = 2,1W.
O máximo recomendado sem dissipador é 1,4W, portanto se estiver com um consumo maior que 200mA, ou voce faz um redução externa com um LM7809 por exemplo ou põe um grande dissipador no regulador do UNO.

Opa
Boa tarde

Desculpe a demora;

Estava conectando a fonte 12v diretamente no arduino e utilizando a saída Vin para a ponte h;
Alterei agora, alimentando diretamente pela ponte h, e parece que cessaram os travamentos.
Os teste que fiz até agora estão funcionando perfeitamente.
Mais uma vez obrigado pela ajuda.
Aprendi muito.
Obrigado

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.