Continuando então com o tutorial de como ligar uma lâmpada, estou postando mais dois vídeos sobre o assunto e mais abaixo o código fonte do exemplo.
VIDEO
Circuito montado e funcionando
VIDEO
código fonte:
#include <EEPROM.h>
//inicio da Classe Lampada
class Lampada {
private:
//atributos
int _pin_rele;
int _pin_sensor_tensao;
int _pin_sensor_corrente;
int _address_eeprom;
String _descricao;
//metodos privados
int _le_eeprom();
void _grava_eeprom();
int _tem_tensao();
int _tem_corrente();
public:
Lampada(int pin_rele,
int pin_sensor_tensao,
int pin_sensor_corrente,
int address_eeprom);
void ligar();
void desligar();
void inverter();
int esta_ligada();
int esta_danificada();
void set_descricao(String descricao);
String get_descricao();
String to_string();
};
Lampada::Lampada(int pin_rele, int pin_sensor_tensao,
int pin_sensor_corrente, int address_eeprom) {
_pin_rele = pin_rele;
_pin_sensor_tensao = pin_sensor_tensao;
_pin_sensor_corrente = pin_sensor_corrente;
_address_eeprom = address_eeprom;
pinMode(_pin_rele, OUTPUT);
//quando o pino for menor ou igual a zero, significa que não será usado sensor de tensão
if (_pin_sensor_tensao > 0) { pinMode(_pin_sensor_tensao, INPUT); }
//quando o pino for menor ou igual a zero, significa que não há sensor de corrente
if (_pin_sensor_corrente > 0) { pinMode(_pin_sensor_corrente, INPUT); }
digitalWrite(_pin_rele, _le_eeprom() );
}
int Lampada::_le_eeprom() { return EEPROM.read(_address_eeprom); }
void Lampada::_grava_eeprom() { EEPROM.write(_address_eeprom, digitalRead(_pin_rele)); }
void Lampada::inverter() {
digitalWrite(_pin_rele, !digitalRead(_pin_rele)); _grava_eeprom();
}
int Lampada::_tem_corrente() {
if ( _pin_sensor_corrente <= 0 ) { return HIGH; } //caso não tenha sensor de corrente
return digitalRead(_pin_sensor_corrente);
}
int Lampada::_tem_tensao() {
//caso não tenha sensor de tensão
if ( _pin_sensor_tensao <= 0 ) { return HIGH; }
for (int i=0;i<4;i++) {
if (!digitalRead(_pin_sensor_tensao)) { return HIGH; }
delay(1);
}
return LOW;
}
void Lampada::ligar() { if (!esta_ligada()) { inverter(); } }
void Lampada::desligar() { if (esta_ligada()) { inverter(); } }
int Lampada::esta_ligada() { return ( _tem_tensao() && _tem_corrente() ); }
int Lampada::esta_danificada() { return ( _tem_tensao() && !_tem_corrente() ); }
String Lampada::get_descricao() { return _descricao; }
void Lampada::set_descricao(String descricao) { _descricao = descricao; }
String Lampada::to_string(){
String str = _descricao;
if (esta_danificada()) {str += " - danificada."; return str;}
str += esta_ligada() ? " - ligada." : " - desligada.";
return str;
}
//fim da classe Lampada
const int PINO_RELE = 8;
const int PINO_SENSOR_TENSAO = 7;
const int PINO_SENSOR_CORRENTE = 6;
const int ADDRESS_EEPROM = 0;
Lampada *lampada_01;
void setup() {
Serial.begin(9600);
lampada_01 = new Lampada(PINO_RELE,
PINO_SENSOR_TENSAO,
PINO_SENSOR_CORRENTE,
ADDRESS_EEPROM);
lampada_01->set_descricao("lampada 01");
}
void loop() {
char tecla = Serial.read();
if (tecla == '1') {
lampada_01->ligar();
} else if (tecla == '2') {
lampada_01->desligar();
} else if (tecla == '3') {
lampada_01->inverter();
}
Serial.println(lampada_01->to_string());
}