Com este pequeno projeto é possível controlar 2 pequenos relés através de um modem discado ( não sei quantos ainda tem um destes, eu ainda tinha um do tempo da discadona ).
Meu problema era com o modem mais moderno: o modem ADSL, durante as viagens de trabalho este modem travava e eu perdia o acesso aos servidores no escritório, quando tinha alguém no escritório era só ligar pedindo pro coitado desligar e ligar o modem, mas no fim de semana e fora do expediente, isso se tornava um problema, pois alguém tinha que se deslocar pro centro só pra resetar o modem
Para resolver este problema, projetei uma placa com um ATMEGA8, compatível com o Arduino, um MAX232 (conversor RS232 para TTL), 2 mini-relés e alguns componentes passivos, conforme o esquemático anexo.
No Arduino programei o código a seguir, ele coloca o modem em espera de 4 toques para atender, ao atender a ligação ele espera os tons de discagem: digitando 1 o relé 1 fica atracado por alguns instante, digitando 2 o relé 2 é acionado, e digitando 0 a ligação é terminada e o Modemduino volta para espera. No relé 1 eu liguei a alimentação do modem ADSL, assim, sempre que eu perdia a conexão com os servidores, eu ligava para o telefone do escritório e comandava o resete.
Neste link está o esquemático em PDF: https://icatorze.files.wordpress.com/2015/11/modemduino.pdf
[code] #include <avr/wdt.h>
#include <avr/interrupt.h>
char inSerial[40];
int i=0;
int ledPin = 8;
int rele1 = 2;
int rele2 = 3;
unsigned long agora;
unsigned long antes;
ISR(TIMER1_COMPA_vect)
{
setaLed(false);
setaReles(false,false);
TCCR1B = (0 << CS10) | (0 << CS11) | (0 << CS12);
}
void setup() {
wdt_disable();
DDRB = 0x01;
DDRD |= (1 << 2) | (1 << 3);
TIMSK |= (1 << OCIE1A);
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 30000;
interrupts();
Serial.begin(57600);
setaLed(true);
Serial.println(“ATH0”);
delay(100);
readresponse();
setaLed(false);
delay(5000);
initvoicemodem();
setaLed(true);
wdt_enable(WDTO_2S);
antes = millis();
}
void loop() {
readresponse();
agora = millis();
if ((agora-antes)>60000) {
setaLed(false);
wdt_enable(WDTO_15MS);
delay(3000);
}
}
void setaLed(boolean x){
if (x) PORTB = 0x01;
else PORTB = 0x00;
}
void setaReles(boolean rl1,boolean rl2){
if (rl1) PORTD |= (1 << 2); //seta rl1
else PORTD &= ~(1 << 2);
if (rl2) PORTD |= (1 << 3); //seta rl2
else PORTD &= ~(1 << 3);
}
void readresponse(){
i=0;
char number;
boolean desliga = false;
wdt_reset();
if (Serial.available() > 0) {
while (Serial.available() > 0) {
inSerial=(Serial.read());
delay(10);
i++;
}
inSerial=’\0′;
for (int j=0;j<i;+) {
if (inSerial[j]==16) { //DLE
number = inSerial[j+1];
if ((number >=’0′) && (number <= ‘9’)) {
setaLed(true);
if(number==’1′) {
setaReles(true,false);
TCCR1B |= (1 << WGM12)| (0 << CS10) | (0 << CS11) | (1 << CS12);
}
if(number==’2′) {
setaReles(false,true);
TCCR1B |= (1 << WGM12)| (0 << CS10) | (0 << CS11) | (1 << CS12);
}
if(number==’0′) {
wdt_enable(WDTO_15MS);
}
break;
}
}
}
inSerial[0]=’\0′;
}
}
void initvoicemodem() {
Serial.println(“AT+FCLASS=8”);
delay(100);
readresponse();
Serial.println(“ATI6”);
delay(100);
readresponse();
Serial.println(“ATS0=4”);
delay(100);
readresponse();
Serial.println(“AT&D0”);
delay(100);
readresponse();
Serial.println(“ATT”);
delay(100);
readresponse();
delay(1000);
}[/code]