Franzininho C0: Detecção de chuva usando Arduino

Este post faz parte da série Franzininho C0 com Arduino

Introdução

Neste tutorial, vamos usar a Franzininho C0 em conjunto com um sensor de chuva, que verifica a presença de chuva no ambiente, um buzzer e um display OLED SSD1306 para criar um sistema de detecção de chuva. 

O objetivo é monitorar a presença de precipitação usando o sensor e exibir o estado atual no display OLED. Além disso, o sistema acionará um alarme sempre que a chuva for detectada. Este projeto será desenvolvido utilizando a IDE do Arduino.

Sensor de Chuva

O sensor de chuva é um dispositivo eletrônico que possui a capacidade de detectar gotas de chuva que caem em sua superfície metalizada. Esse componente é composto por duas partes distintas: uma placa eletrônica (localizada à direita) e uma placa metálica coletora (localizada à esquerda).

Figura 1 – Sensor de chuva.

O princípio de funcionamento do sensor de chuva é o seguinte: quando uma gota de água entra em contato com a superfície da placa metálica coletora, a resistência elétrica aumenta, resultando em uma diminuição na tensão de saída. Em contrapartida, quando a placa metálica está seca, a resistência elétrica é menor, levando a uma tensão de saída mais alta. Portanto, o desempenho do sensor de chuva é diretamente influenciado pela variação da resistência da placa coletora.

Materiais necessários 

  • Franzininho C0
  • Protoboard
  • Sensor MQ135
  • Buzzer
  • Display OLED SSD1306
  • Jumpers

Pinout da Franzininho C0

Para definir os pinos utilizados, precisamos consultar o pinout da placa:

Acesse a documentação completa em:

https://docs.franzininho.com.br/docs/franzininho-c0/franzininho-c0-board

Circuito

Conecte a Franzininho C0 à protoboard. Em seguida, conecte os pinos GND e 3,3 V na protoboard para fornecer energia aos demais dispositivos.

Vamos começar com o sensor, que possui 4 pinos: VCC, GND, A0 (saída analógica) e D0 (saída digital). A identificação de cada pino está impressa na parte inferior do sensor. Siga os passos abaixo para conectá-lo à placa:

  1. Conecte o pino VCC do sensor ao trilho de 3,3 V da protoboard.
  2. Conecte o pino GND do sensor ao trilho de GND da protoboard.
  3. Conecte o pino D0 do sensor a um dos pinos digitais da Franzininho C0 (por exemplo, PA4).
  4. A saída analógica não será utilizada.

Em seguida, conecte o terminal maior do buzzer a um dos pinos digitais da Franzininho C0 (por exemplo, PA0) e o terminal menor à trilha GND na protoboard.

Por último, siga as instruções abaixo para conectar o Display OLED:

  1. Conecte o Display OLED à protoboard.
  2. Conecte o terminal GND do Display à trilha GND da protoboard.
  3. Conecte o terminal VCC do Display à trilha VCC da protoboard.
  4. Conecte o terminal SCL ao pino PB6.
  5. Conecte o terminal SDA ao pino PC14.

Para se orientar quanto aos pinos da Franzininho C0, basta visualizar o pinout da placa acima.

A montagem ficará conforme mostrado na imagem abaixo:

Figura 2 – Montagem do projeto na protoboard.

Código

Para criar um sistema de precipitação usando a Franzininho C0, utilizaremos o código a seguir:

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// Endereço I2C do SSD1306
#define I2C_ADDRESS 0x3C

// Define pinos
#define SCL_PIN PB6
#define SDA_PIN PC14
#define digitSensor PA4
#define buzzer PA0

// Define reset do display
#define RST_PIN -1

SSD1306AsciiWire oled;

void setup() {
  // Configura pinos i2c
  Wire.setSCL(SCL_PIN);
  Wire.setSDA(SDA_PIN);
  Wire.begin();

  // Configura pinos uart
  Serial.setRx(PA_10_R);
  Serial.setTx(PA_9_R);
  Serial.begin(115200);

  // Configura entradas e saídas
  pinMode(digitSensor, INPUT);
  pinMode(buzzer, OUTPUT);

  // Inicia display
  #if RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
  #else // RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C_ADDRESS);
  #endif // RST_PIN >= 0

  oled.setFont(Adafruit5x7);
  oled.clear();
}
void loop() {
  static bool previousState = false; // Variável para armazenar o estado anterior do sensor

  // Leitura do estado atual do sensor
  bool currentState = digitalRead(digitSensor) == 1;

  // Verifica se o estado do sensor mudou
  if (currentState != previousState) {
    previousState = currentState;

    // Limpa e atualiza o display
    oled.clear();
    oled.set2X();

    if (currentState) {
      oled.println("Sem chuva");
      digitalWrite(buzzer, 0);
    } else {
      oled.println("Chovendo");
      digitalWrite(buzzer, 1);
    }
  }

  delay(1000);
}

Obs.1: Antes da IDE iniciar o carregamento do programa, a Franzininho C0 deve executar o bootloader, caso contrário ocorrerá um erro.

Obs.2: Recomendamos o uso da IDE 1.8.x do Arduino para essa aplicação.

Explicação do Código

Antes do setup(), precisamos incluir as bibliotecas necessárias para utilizar o protocolo I2C e para escrever no Display OLED:

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

Além disso, vamos criar variáveis para armazenar os pinos do I2C, o pino digital do buzzer e os pinos do sensor de chuva, onde apenas o digital é utilizado. Também é definido o endereço do Display e o seu reset.

// Endereço I2C do SSD1306
#define I2C_ADDRESS 0x3C

// Define pinos
#define SCL_PIN PB6
#define SDA_PIN PC14
#define analogMq A2
#define digitMQ PA4
#define buzzer PA0

// Define reset do Display
#define RST_PIN -1

Por último, criamos o objeto oled que será usado para inicializar o Display, definir fontes e escrever textos e dados no Display.

SSD1306AsciiWire oled;

No setup(), começamos configurando os pinos no I2C usando ‘Wire.setSCL’ e ‘Wire.setSDA’, e também os pinos para a comunicação serial da placa utilizando ‘Serial.setRx()’ e ‘Serial.setTx()’.

void setup() {
  // Configura pinos i2c
  Wire.setSCL(SCL_PIN);
  Wire.setSDA(SDA_PIN);
  Wire.begin();

  // Configura pinos uart
  Serial.setRx(PA_10_R);
  Serial.setTx(PA_9_R);
  Serial.begin(115200);
...
}

Depois, definimos o pino do sensor como entrada e o buzzer como saída:

 [ ... // Configura entradas e saídas
  pinMode(digitSensor, INPUT); 
  pinMode(buzzer, OUTPUT);
... }

Por último, inicializamos o Display, definimos a fonte e limpamos a tela para preparar o Display para uso:

{...  // Inicia Display
  #if RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
  #else // RST_PIN >= 0
    oled.begin(&Adafruit128x64, I2C_ADDRESS);
  #endif // RST_PIN >= 0

  oled.setFont(Adafruit5x7);
  oled.clear();
}

No loop(), começamos criando uma variável booleana para armazenar o estado anterior do sensor (‘currentState’) e outra para armazenar o estado atual (‘previousState’). 

É importante entender que a expressão ‘bool currentState = digitalRead(digitSensor) == 1’, trata-se de uma comparação que terá como resultado true ou false. Se digitalRead(digitSensor) retornar 1 (alto), a expressão digitalRead(digitSensor) == 1 é avaliada como true. Se digitalRead(digitSensor) retornar 0 (baixo), a expressão é avaliada como false.

O objetivo é verificar se há mudanças no estado (‘currentState != previousState’) do sensor para atualizar o display OLED. Se não houver mudanças no estado, a mensagem exibida no display permanece inalterada.

void loop() {
  static bool previousState = false; // Variável para armazenar o estado anterior do sensor

  // Leitura do estado atual do sensor
  bool currentState = digitalRead(digitSensor) == 1;

  // Verifica se o estado do sensor mudou
  if (currentState != previousState) {
    previousState = currentState;
...}
}

Então, uma vez que o estado do sensor muda, o display é limpo e o valor do estado atual é verificado. Se o estado for 1, o display exibirá “Sem chuva” e o buzzer permanecerá inativo, indicando que nenhuma detecção foi realizada. Se o estado for 0, o display mostrará “Chovendo” e o buzzer será acionado, sinalizando a detecção de chuva.

A verificação do estado do sensor é feita a cada segundo:

// Limpa e atualiza o display
    oled.clear();
    oled.set2X();

    if (currentState) {
      oled.println("Sem chuva");
      digitalWrite(buzzer, 0);
    } else {
      oled.println("Chovendo");
      digitalWrite(buzzer, 1);
    }
  }

  delay(1000);
}

Ao executar o código, conforme mostrado no vídeo, o display exibe se há ou não detecção de chuva, acompanhado pelo sinal sonoro do buzzer. Durante o experimento, utilizamos água, o que fez com que o alarme fosse acionado instantaneamente e o texto no Display mudasse.

Conclusão

Neste projeto, desenvolvemos um sistema de detecção de chuva utilizando a Franzininho C0, um buzzer e um sensor de chuva. O sensor detecta a precipitação através da variação na resistência de sua placa coletora, enquanto o display OLED e o buzzer são usados para fornecer uma sinalização imediata da presença de chuva.

Desafio

Neste desafio, você irá aprimorar o projeto de detecção de chuva adicionando o sensor DHT11 para medir a temperatura e a umidade do ambiente. Esse aprimoramento permitirá que o sistema não apenas detecte a presença de chuva, mas também forneça informações adicionais sobre as condições climáticas. 

Franzininho C0 com Arduino

Franzininho C0: Monitoramento da Qualidade do Ar com Sensor MQ135 usando Arduino Franzininho C0: Monitoramento de Temperatura e Umidade com Sensor DHT11
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Maker » Franzininho C0: Detecção de chuva usando Arduino

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: