ON OF PC con ARDUINO

Ciao a tutti Sto realizando un circuito per arduino
in pratica quello che voglio fare e avere uno shield per accendere e spegnere il pc da telecomando.
per fare questo ho realizato il mio circuito su breadboard con
un ricevitore infrarosso il quale quando capta il segnale del telecomando simula la pressione del pulsante on/off che sta sul case collegando il normalemente aperto di un relay in parallelo ai due fili che vengono dal pulsante sul case(il relay lo eccito facendo andare in interdizione un transistor NPN e viceversa).
ho messo il relay per cercare di disaccoppiare i contatti non dovrebbe succedere ma nn vorrei generare qualche corrente e bruciare la scheda madre.

ora fin qui funziona tutto bene ho testato e funziona l'accensione il mio problema e che vorrei usarlo anche per spegnerlo, nei nuovi sistemi operativi alla pressione del pulsante dovrebbe chiudersi windows normalmente cosa che succede pero se spengo con arduino cioè simulando tramite telecomando come spiegato sopra si spegne si, ma quando riaccendo il pc sia con telecomando o con pulsante mi appare la classica schermata nera che il sistema era stato spento in modo imprevisto e mi fa scegliere se avviare windows in modalita provvisoria o normalmente.
ma non capisco il perchè visto che se spengo il pc dal pulsante sul case non succede nulla, si spegne correttamente.

avreste qualche consiglio grazie

Non c'è nessuno che abbia avuto qualcosa di simile?

Se chiudi il contatto per più di 4 secondi il PC si spegne immediatamente.
Devi chiuderlo per non più di mezzo secondo, 200millisecondi credo vadano bene.

senó prendi un arduino Leonardo e simula una tastiera o mouse. Devi mandare i pulsanti giusti per la sequenza di spegnimento oppure se lo usi come mouse devi vedere dove posizionare il cursore e dove premere i tasti.
Ciao Uwe

Non conosco bene Arduino Leonardo i testi li sto facendo con un Arduino uno, provero a mandare un impulso per non più di 200millisecondi come suggerito da PaoloP, vi faro sapere.

ciao a tutti questo è il mio codice

#include <IRremote.h>
 
int RECV_PIN = 11;

int state=0;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
decode_results old_results; 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(9,OUTPUT);
}
 
void loop() {
  //leggo il valore in input proveniente dal IR
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  //controllo se è avvenuta una transizione
  if((results.value==2060||results.value==12)&&(old_results.value!=2060||old_results.value!=12)){
    state=1-state;
    delay(5000);
  }
  old_results=results;
  if(state==1)
   {
     digitalWrite(9,HIGH);//l'impulso non deve essere superiore a 200millisecondi
     Serial.println("ON");
     results.value=0;
     delay(200);
     Serial.println("OFF");
     digitalWrite(9,LOW); 
      state=1-state; 
   } 
 }

in questo modo ho modificato rifacendomi all esempio che sta sul libro di Massimo Banzi "La guida ufficiale" cercando di capire quando vi è effettivamente la transazione funziona ma nn tanto bene nel senso che se premo arduino potrebbe leggere piu volte mentre sto premendo quindi mi invia piu impulsi mi servirebbe riuscire ad escludere tt gli impulsi almeno per un tot dopo che si arrivato il primo nel senso se io premo lui invia un impulso ma puoi succedere che me lo invi piu volte se legge mentre sto premendo piu volte. se devo accedere un pc nn servre a niente che una volta inviato l impulso per accendere dopo 3 secondi me ne invi un altro per spegnere mi sembra brutto anche al contrario ciao accetto qualunque critica

metti il codici negli appositi "tag", terzultimo pulsante seconda riga, e sara piu leggibile :smiley:

Ovvero il code tag: [ code] tuo codice [/ code] senza gli spazi, li ho messi io per renderli leggibili

Ok grazie adesso aspettiamo qualche aiutino

Metti un controllo fatto con millis per cui per xxx millisecondi tutti i comandi che eventualmente arrivano dopo la ricezione corretta di uno di essi vengano ignorati.

scusa ma non ho capito dove dovrei inserire il controllo

Il controllo lo devi mettere nel punto in cui fai la lettura dell'input da iR. Lì ci metti un check con millis, un check basato sul tempo trascorso dalla precedente attivazione del comando.

Quindi, quando esegui il comando assegnato all'input arrivato via iR salvi lo stato attuale di millis. Quando arriva un nuovo impulso, controlli se è passato il valore preimpostato ed esegui il nuovo comando solo questo tempo è passato.

ciao ho provato cosi :

#include <IRremote.h>
 
int RECV_PIN = 11;

int state=0;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
decode_results old_results; 
int lastTime;
int duration;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(9,OUTPUT);
  lastTime=millis();
}
 
void loop() {
  //leggo il valore in input proveniente dal IR
  duration=millis()-lastTime;
   if (irrecv.decode(&results)) {
    Serial.println(lastTime);
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  //controllo se è avvenuta una transizione
  if((results.value==2060||results.value==12)&&(duration>10000)){//&&(old_results.value!=2060||old_results.value!=12)
    state=1-state;
    Serial.println(results.value+" "+old_results.value);
    lastTime=millis();
  }
  old_results=results;
  if(state==1)
   {
     digitalWrite(9,HIGH);//l'impulso non deve essere superiore a 200millisecondi
     Serial.println("ON");
     results.value=0;
     delay(200);
     Serial.println("OFF");
     digitalWrite(9,LOW); 
      state=1-state; 
   } 
   //if(results.value==2061||results.value==13){
   // digitalWrite(9,LOW);
  //}
}

ma nn funziona ancora bene nel senso che nn ignora gli impulsi che arrivano nell intervallo di tempo ma li ritarda di 10000 millsec

le schede madri dei pc desktop hanno un ingresso per spegnere la scheda madre dal modem, basta cortocirctuitarlo

altra soluzione è usare un programma usato per gli ups per spegnere il pc attraverso una porta rs232, se mandi sulla rs232 il comando giusto il pc si spegne

grazie del consiglio ma a me interessava farlo con arduino.
comunque per chi puo interessare si alla fine sono riuscito con la funzione millis() come suggerito sopra.
si calcola il tempo trascorso a partire da lastTime:

duration=millis()-lastTime;

poi se è stato premuto il tasto che mi interessa e sono trascorsi 20000 millisecondi (20 sec) invio l'impulso altrimenti non faccio nulla.
a breve faro le prove sul pc vi faro sapere se si è bruciato :slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

Il comando di spegnimento PC via rs232 indirizzato al programma UPS .. puoi inviarlo proprio con arduino...

Ma una volta spento da seriale può anche riaccenderlo ? Si può fare via lan, non so via seriale.
Di certo così come fa lui con il relè è il modo più classico e tranquillo essendo isolato dalla sk madre.
La seriale sta sparendo non solo dai portatili ma anche dai fissi, anche se spesso è presente sulla skmadre e deve solo essere tirata fuori con apposito braket.

No si può solo spegnere, va ben, non fà al caso tuo
La seriale Rs232 è sparita ma la USB c'è , basta un convertitore da pochi euro

Certo,
Ma restando sul tema seriale, non ? che nei bios, magari vecchi, esiste un wake on modem ?
Negli anni passati non si potevano accendere pc da remoto ?
Ricordo parecchi wake on qualcosa visti nei bios.

Dovrebbe essere connesso tramite un piccolo connettore sulla MB passo 2mm o 2.54mm, non ricordo, ma nei notebook non c'è