Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Criado em 08 Jan 2016
- por Felipe Mendes
- ***Este exemplo é de domínio público.***
- [DATALOGGER TRANSMISSOR RF433]
- Este exemplo mostra como montar um datalogger com transmissor
- de dados por RF433 usando um arduino NANO.
- O circuito:
- #Rf433:
- ** Tx - pin D7
- #DHT22:
- ** Data - pin D8
- #RTC DS1307
- **SCL - pin A5
- **SDA - pin A4
- #LCD I2C:
- **SCL - pin A5
- **SDA - pin A4
- */
- #include <LiquidCrystal_I2C.h>
- #include <VirtualWire.h>
- #include "DHT.h"
- #include "Wire.h"
- const int chipSelect = 4;
- #define DHTPIN 8 // Pino digital 8 conectado DHT22
- #define DHTTYPE DHT22 // DHT 22
- #define DS1307_ADDRESS 0x68
- byte zero = 0x00;
- DHT dht(DHTPIN, DHTTYPE);
- int ledPin = 13;
- char Msg[50];// String que será enviada através do rf transmissor
- byte thermometer[8] = //Icone para termômetro
- {
- B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110
- };
- byte droplet[8] = //Icone para gota
- {
- B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110,
- };
- #define Buzzer 9
- #define bUp 6
- #define bDown 5
- #define bUp0 92
- #define bDown0 93
- boolean aUp, aDown; // Grava o ultimo valor lidos nos botões.
- // Utilizado pela função Checkbutton p/ identificar quando há uma alteração no estado do pino dos botões
- int variavel; // variavel a ser alterada pelo menu
- char state=1; // variável que guarda posição atual do menu
- LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
- int segundos ;
- int minutos ;
- int horas = ;
- int diadasemana ;
- int diadomes ;
- int mes ;
- int ano ;
- void setup()
- {
- Wire.begin();
- Serial.begin(9600);
- lcd.begin(16,2);
- lcd.backlight(); // finish with backlight on
- lcd.createChar(1, thermometer);
- lcd.createChar(2, droplet);
- pinMode(Buzzer, OUTPUT); // Buzzer
- pinMode(bUp, INPUT);
- pinMode(bDown, INPUT);
- digitalWrite(bUp, HIGH);
- digitalWrite(bDown, HIGH);
- //A linha abaixo pode ser retirada apos setar a data e hora
- //SelecionaDataeHora();
- dht.begin(); // Inicializando o DHT sensor
- pinMode(ledPin,OUTPUT);
- // VirtualWire setup
- vw_setup(2000); // Bits por seg
- vw_set_tx_pin(7);// Set o pino digital 7 Tx pin.
- }
- void loop(){
- // Leia e grave os dados do sensor
- int humidity = dht.readHumidity();
- int temp = dht.readTemperature();
- int f = dht.readTemperature(true);
- Wire.beginTransmission(DS1307_ADDRESS);
- Wire.write(zero);
- Wire.endTransmission();
- Wire.requestFrom(DS1307_ADDRESS, 7);
- segundos = ConverteparaDecimal(Wire.read());
- minutos = ConverteparaDecimal(Wire.read());
- horas = ConverteparaDecimal(Wire.read() & 0b111111);
- diadasemana = ConverteparaDecimal(Wire.read());
- diadomes = ConverteparaDecimal(Wire.read());
- mes = ConverteparaDecimal(Wire.read());
- ano = ConverteparaDecimal(Wire.read());
- sprintf(Msg, "%d,%d,%d", segundos,minutos,horas);
- // Turn on a light to show transmitting
- digitalWrite(ledPin, HIGH);
- vw_send((uint8_t *)Msg, strlen(Msg));
- vw_wait_tx(); // Aguarda até toda a mensagem ser enviada.
- // Turn off a light after transmission
- digitalWrite(ledPin, LOW);
- for(int i=0;i<75;i++);
- //Display LCD
- switch (state) { // Define checa qual tela atual
- case 1: // executado quando na TELA 1
- switch (CheckButton()) {
- case bUp:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(4); // antes de mudar de tela, é necessário limpar o
- break; // display com a função lcd.clear()
- case bDown:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(2);
- break;
- default: // Caso nenhum botão tenha sido apertado, ela executa a set_state
- Set_state(1); // mesmo assim para atualizar o display.
- }
- break;
- case 2: // executado quando na TELA 2
- switch (CheckButton()) {
- case bUp:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(1);
- break;
- case bDown:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(3);
- break;
- default:
- Set_state(2);
- }
- break;
- case 3: // executado quando na TELA 3
- switch (CheckButton()) {
- case bUp:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(2);
- break;
- case bDown:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(4);
- break;
- default:
- Set_state(3);
- }
- break;
- case 4: // executado quando na TELA 4
- switch (CheckButton()) {
- break;
- case bDown:
- digitalWrite(Buzzer,HIGH);
- delay(200);
- digitalWrite(Buzzer,LOW);
- lcd.clear(); Set_state(1);
- break;
- default:
- Set_state(4);
- }
- break;
- default: ;
- }
- }
- void SelecionaDataeHora() // Seta a data e a hora do DS1307
- {
- byte segundos = 40; // Valores de 0 a 59
- byte minutos = 35; // Valores de 0 a 59
- byte horas = 19; // Valores de 0 a 23
- byte diadasemana = 5; // Valores de 0 a 6 (0=Domingo, 1 = Segunda...)
- byte diadomes = 29; // Valores de 1 a 31
- byte mes = 1; // Valores de 1 a 12
- byte ano = 16; // Valores de 0 a 99
- Wire.beginTransmission(DS1307_ADDRESS);
- // Stop no CI para que o mesmo possa receber os dados
- Wire.write(zero);
- // As linhas abaixo escrevem no CI os valores de
- // data e hora que foram colocados nas variaveis acima
- Wire.write(ConverteParaBCD(segundos));
- Wire.write(ConverteParaBCD(minutos));
- Wire.write(ConverteParaBCD(horas));
- Wire.write(ConverteParaBCD(diadasemana));
- Wire.write(ConverteParaBCD(diadomes));
- Wire.write(ConverteParaBCD(mes));
- Wire.write(ConverteParaBCD(ano));
- Wire.write(zero); //Start no CI
- Wire.endTransmission();
- }
- byte ConverteParaBCD(byte val)
- {
- // Converte o número de decimal para BCD
- return ( (val/10*16) + (val%10) );
- }
- byte ConverteparaDecimal(byte val)
- {
- // Converte de BCD para decimal
- return ( (val/16*10) + (val%16) );
- }
- //Função CheckButton
- char CheckButton() {
- if (aUp!=digitalRead(bUp)) {
- aUp=!aUp;
- if (aUp) return bUp0; else return bUp;
- } else
- if (aDown!=digitalRead(bDown)) {
- aDown=!aDown;
- if (aDown) return bDown0; else return bDown;
- } else
- return 0;
- }
- void Set_state(char index) {
- state = index; // Atualiza a variável state para a nova tela
- switch (state) { // verifica qual a tela atual e exibe o conteúdo correspondente
- case 1: //==================== state 1
- lcd.setCursor(0,0);
- lcd.print ("[ ECO LOGGER ]");
- lcd.setCursor(0,1);
- lcd.print ("By:Felipe Mendes");
- break;
- case 2: //==================== state 2
- lcd.setCursor(0,0);
- // Mostra a hora atual no display
- lcd.print("[ ");
- if (horas < 10){
- lcd.print("0");}
- lcd.print(horas);
- lcd.print(":");
- if (minutos < 10){
- lcd.print("0");}
- lcd.print(minutos);
- lcd.print(":");
- if (segundos < 10){
- lcd.print("0");}
- lcd.print(segundos);
- lcd.print(" ]");
- lcd.setCursor(0,1);
- // Mostra a data atual no display
- lcd.print("[");
- if (diadomes < 10){
- lcd.print("0");}
- lcd.print(diadomes);
- lcd.print("/");
- if (mes < 10){
- lcd.print("0");}
- lcd.print(mes);
- lcd.print("/");
- lcd.print("20");
- lcd.print(ano);
- //Mostra o dia da semana no display
- switch(diadasemana)
- {
- case 0: lcd.print(" Dom]");
- break;
- case 1: lcd.print(" Seg]");
- break;
- case 2: lcd.print(" Ter]");
- break;
- case 3: lcd.print(" Qua]");
- break;
- case 4: lcd.print(" Qui]");
- break;
- case 5: lcd.print(" Sex]");
- break;
- case 6: lcd.print(" Sab]");
- }
- break;
- case 3: //==================== state 3
- lcd.setCursor(0,0);
- lcd.print("[ Temp: ");
- lcd.write(1);
- lcd.print(26);
- lcd.write(0b11011111);
- lcd.print("C ]");
- lcd.setCursor(0,1);
- lcd.print ("[ Umid: ");
- lcd.write(2);
- lcd.print (97);
- lcd.print ("% ]");
- break;
- case 4: //==================== state 4
- break;
- default: ;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement