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).
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:
- Conecte o pino VCC do sensor ao trilho de 3,3 V da protoboard.
- Conecte o pino GND do sensor ao trilho de GND da protoboard.
- Conecte o pino D0 do sensor a um dos pinos digitais da Franzininho C0 (por exemplo, PA4).
- 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:
- Conecte o Display OLED à protoboard.
- Conecte o terminal GND do Display à trilha GND da protoboard.
- Conecte o terminal VCC do Display à trilha VCC da protoboard.
- Conecte o terminal SCL ao pino PB6.
- 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:
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 -1Por ú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.




