/*
* COMPONENTE DS18B20 - Sensor de temperatura tipo sonda, a prova d'água
* Bilbiotecas necesárias: OneWire
* DallasTemperature (DS18B20)
* Description: O DS18B20 é um tipo de sensor que fornece leituras de temperatura de 9 a 12 bits.
* Esses valores mostram a temperatura de um determinado dispositivo ou ambiente.
* A comunicação deste sensor pode ser feita através de um protocolo de barramento
* de um fio que usa uma linha de dados para se comunicar com um microprocessador interno.
* Além disso, este sensor obtém a fonte de alimentação diretamente da linha de dados,
* de modo que a necessidade de uma fonte de alimentação externa pode ser eliminada.
* As aplicações do sensor de temperatura DS18B20 incluem sistemas industriais, produtos
* de consumo, sistemas que são sensíveis termicamente, controles termostáticos e
* termômetros.
* Fios: Vermelho - VCC
* Preto - GND
* Amarelo - Dados (pino digital 2)
*
* Referência: https://blog.eletrogate.com/guia-completo-sobre-sensor-de-temperatura-ds18b20-a-prova-dagua/
* obs: utilizaçao de bilbioteca "Wire.h" para comunicação I2C.
* adress: master 0x07 - Arduino Uno
* slave 0x08 - Arduino Uno
* slave 0x09 - Arduino Nano
* BMP280 0x76 - Sensor de temperatura e pressão
* LCD 16x2 0x27 - LCD
* RTC 1307 0x50 / 0x58 / 0x68
*/
#include <Wire.h> // Biblioteca nativa do core
#include <LiquidCrystal_I2C.h> // for LCD 16x2 with I2C module
//Inicializa o display no endereco 0x27
LiquidCrystal_I2C lcd(0x27,16,2);
// endereco do modulo slave que pode ser um valor de 0 a 255
//const int myAdress 0x09;
#define myAdress 0x09
// endereço do disposivo Master (Arduino Uno)
//const int masterAdress 0x07;
#define masterAdress 0x07
/* Variáveis globais */
const int _BaudRate = 9600;
// Carrega apenas na inicialização
void setup() {
// Inicializando Serial monitor
Serial.begin(_BaudRate);
//Escrevendo no Serial Monitor
Serial.println("Inicializando Sistema de Controle de Temperatura...");
// ingressa ao barramento I2C com o endereço definido no myAdress (0x08)
Wire.begin(myAdress);
//Registra um evento para ser chamado quando chegar algum dado via I2C
Wire.onReceive(receiveEvent);
// inicializa o RTC
prepareRTC();
//Chama a função que lê a Sonda de temperatura
prepare_DS18BS20();
// carrega o setup do LCD
prepare_LCD();
}
//Loop de repetição do sistema
void loop(){
monitoringRTC();
monitoring_DS18BS20();
Serial.print(get_TimeStamp());
Serial.print("\tTemperatura: ");
Serial.print(get_temperature());
Serial.println("°C");
// incia a transmissao para o endereco 0x07 (MasterAdress)
Wire.beginTransmission(masterAdress);
// Cria e formata a mensagem para envio
String message ="";
message.concat(get_temperature());
//message.concat("°C"\n);
Wire.write(message.c_str());// envia a mensagem
Wire.endTransmission(); // encerra a transmissao
//Escrever no LCD
lcd.setCursor(0,0); lcd.print(get_Time());
lcd.setCursor(0,1); lcd.print("TE:");
lcd.setCursor(4,1); lcd.print(get_temperature());
lcd.setCursor(9,1); lcd.write(B11011111); // Símbolo de graus Celsius
lcd.setCursor(10,1); lcd.print("C");
/*lcdWriteMsg(0, 1, "TE:");
lcdWriteMsg(4, 1, get_temperature());
lcdWriteMsg(9, 1, "°C");*/
delay(1000);
}
// funcao executada sempre que algum dado e recebido no barramento I2C
// vide "void setup()"
void receiveEvent(int howMany) {
// verifica se existem dados para serem lidos no barramento I2C
if (Wire.available()) {
// le o byte recebido
char received = Wire.read();
}
}