Accensione pc da remoto e di un motore elettrico tramite doppia pressione

Buongiorno a tutti,

premettiamo di essere digiuni di elettronica, di programmazione sull'Arduino, nonchè della sua corretta configurazione. Abbiamo la necessità di far funzionare da remoto un motore per noi importante.

Chiediamo aiuto a voi, non sappiamo a chi rivolgerci, per poter risolvere il problema che si è venuto a creare nel momento in cui abbiamo provato ad effettuare nuovamente i collegamenti della nostra unità, nel tentativo di attivare un pc e un motore elettrico gestiti da remoto.

Siamo dovuti entrare in contatto con la realtà dell'ArduinoUno per supplire alle generose capacità di una persona che poche settimane addietro, prematuramente purtroppo è scomparsa, lasciandoci alla mercè di un dispositivo del quale non sappiamo poco e nulla, ma che per via di un trasferimento in altro locale, tale unità composta da:

ArduinoUno
Schedina relè
Computer pc
Motore elettrico
Due prese intelligenti wifi

sono stati necessariamente scollegati e disattivati per effettuare il trasloco. E qui che noi siamo andati in panico in quanto ora non sappiamo più come regolarci!

Infatti al momento di riconfigurare nuovamente tutta l'unità, “qualcosa” non andata per il verso giusto, dato che dopo il trasferimento, tale unità non ha più ripreso a funzionare, come invece succedeva in precedenza.

Fatta questa doverosa premessa, proviamo a spiegare le funzionalità (vogliate perdonare la nostra non qualificata sintassi) attribuite all’ArduinoUno anticipando che, sia il codice scritto a suo tempo per far fungere le funzioni, dovrebbe essere stato scritto correttamente e sia i principali collegamenti elettrici tra ArduinoUno, schedina relè e motore elettrico, sono rimasti tali e quali, fatte eccezioni per il cavo USB che collega l'Arduino al pc, le rispettive alimentazioni elettriche dell'Arduino, del pc, del motore elettrico e di 2 prese intelligenti wifi

Va da se che è di vitale importanza per noi far funzionare il pc e il motore elettrico da remoto per mezzo di un secondo pc via internet. Ma non è questo il nostro problema.

Le funzionalità che furono programmate all’ArduinoUno sono quelle di:

a) consentire di accendere/spengere da remoto sia il pc con Win 10 (nel bios del pc purtroppo non è presente nessuna procedura per l'accensione da remoto tipo: "Wake on Lan" et simili) e sia l'ArduinoUno con la schedina relè;

b) dopo l’accensione del sopraddetto pc per mezzo di un semplice programmino d'interfaccia dell'Arduino era possibile accendere il motore elettrico per mezzo di un click (pulsante on), simulando però due specifiche pressioni distanziate tra loro da circa un secondo. Soltanto dopo questa doppia pressione era possibile attivare il motore elettrico.

Tuttavia nella vecchia configurazione curata dal socio scomparso, ricordiamo che a monte della presa di alimentazione del pc e del motore elettrico erano inserite le prese intelligente, gestite via Wifi, le quali permettevano di dare e togliere corrente sia al pc, una volta spento correttamente come da prassi richiesta da Microsoft e sia al motore elettrico.

A computer acceso per mezzo del programmino dell’ArduinoUno (in fondo alla mail alleghiamo lo screenshot dell'interfaccia) con un semplice click (tastino on) era possibile accendere il motore elettrico.

Questo avveniva simulando la doppia pressione - distanziata da circa un secondo - necessaria per accendere il motore elettrico, non prima però di aver dato corrente al motore elettrico tramite impulso di una delle due prese intelligenti.

Sempre tramite il programmino dell’ArduinoUno era inoltre possibile con un click, spengere il motore (tasto off dell'interfaccia ArduinoUno), questa volta simulando però una singola pressione.

d) Tramite la 2a presa intelligente WiFi era possibile infine togliere la corrente per spegnere definitivamente il motore elettrico

Ora quello che domandiamo è sapere intanto:

1) la procedura, eventualmente se ritenete sia necessario, dover caricare nuovamente in memoria dell'Arduino il codice di cui abbiamo conservato copia realizzata dal nostro socio e che alleghiamo in fondo alla mail, al vostro cospetto per una ulteriore analisi-verifica.

2) come devono essere installati e qual'è l'ordine corretto di tutte le unità di cui sopra affichè possano ritornare a funzionare? Purtroppo nessuno di noi ricorda l'ordine preciso di come sono stati configurati i vari componenti.

Vi ringraziamo della pazienza e della premurosa attenzione che vorrete dedicare a questa nostra disfunzione, per noi di fondamentale, supplicandovi di aiutarci a risolvere la questione!
Grazie a nome di tutti i soci del circolo GVN

Il nostro codice ArduinoUno:

// Relay
//10 gennaio 2020
int relay1 = 4;
int relay2 = 5;
int relay3 = 6;
int relay4 = 7;

void setup() {
 pinMode(relay1, OUTPUT);
 pinMode(relay2, OUTPUT);
 pinMode(relay3, OUTPUT);
 pinMode(relay4, OUTPUT);

 digitalWrite(relay1,HIGH);
 digitalWrite(relay2,HIGH);
 digitalWrite(relay3,HIGH);
 digitalWrite(relay4,HIGH);
 
 Serial.begin(9600);           // set up Serial library at 9600 bps

}

void loop() 

{
 if( Serial.available() >= 0 )  // all incoming communications are fixed length at 6 bytes including the \n
 {
   char* cmd;
   char* data;
   char temp[10];
   
   int len = 0;

   char str[20];
   memset(str, 0, 20);
   
 // I don't personally like using the \n as a command character for reading.  
 // but that's how the command set is.
   Serial.readBytesUntil('\n', str, 20);

 cmd = str + 1;
 data = str + 2;
 
 // useful for debugging to make sure your commands came through and are parsed correctly.
   if( false )
   {
     sprintf( temp, "cmd = >%c%s;", cmd, data);
     Serial.println(temp);
   } 

       switch( *cmd )
   {
     
// OUT 1 ON
     case 'A':
     digitalWrite(relay1, HIGH);
     delay(500);
     digitalWrite(relay1, LOW); 
     delay(500);
     digitalWrite(relay1, HIGH);
     delay(500);
     digitalWrite(relay1, LOW);
     delay(500);
     digitalWrite(relay1, HIGH);
     //sprintf( temp, "1 ON", cmd, data);
     //Serial.println(temp);
     //Serial.println("Relay 1 ON");
     break;

// OUT 1 OFF
     case 'E':
     digitalWrite(relay1, HIGH);
     delay (500);
     digitalWrite(relay1, LOW);
     delay (500);
     digitalWrite(relay1, HIGH);
     Serial.println("Relay 1 OFF");
     break;

// OUT 2 ON
     case 'B':
     digitalWrite(relay2, HIGH);
     Serial.println("Relay 2 ON");
     break;

// OUT 2 OFF
     case 'F':
     digitalWrite(relay2, LOW);
     Serial.println("Relay 2 OFF");
     break;
// OUT 3 ON
     case 'C':
     digitalWrite(relay3, HIGH);
     Serial.println("Relay 3 ON");
     break;

// OUT 3 OFF
     case 'G':
     digitalWrite(relay3, LOW);
     Serial.println("Relay 3 OFF");
     break;

// OUT 4 ON
     case 'D':
     digitalWrite(relay4, HIGH);
     Serial.println("Relay 4 ON");
     break;

// OUT 4 OFF
     case 'H':
     digitalWrite(relay4, LOW);
     Serial.println("Relay 4 OFF");
     break;
     
    } 

}
}

interfaccia-ArduinoUIno.jpg

interfaccia-ArduinoUIno.jpg

Buonasera e benvenuto :slight_smile: ,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

>sargassi: ... leggi attentamente quanto ho scritto ... NON devi fare un nuovo post (che sarebbe un duplicato e che ho cancellato), devi correggere il tuo primo !!!

gpb01:
... devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE ...

Grazie.

Guglielmo

Il codice arduino usa 4 pin per controllare 4 relè. 1) nel circuito si dovranno usare questi numero di pin o se si usano altri pin, cambiarli nel programma.

2)Il codice arduino non svolge nessuna funzione di comunicazione da remoto, si limita a ricevere da seriale sue caratteri. Per cui Arduino non si occupa dell'accensione del computer.

3)Il problema non è arduino e il suo programma, l'accensione del computer avveniva non attraverso arduino, per cui i vostri problemi non sono strettamente legati ad arduino e quindi poco attinenti a questo forum.

Io ho visto anche altri errori molto gravi in quel programma

Ma fino a quando gli OP non mettono a posto il loro primo post e non si chiarisce la situazione rimango in attesa

Evviva, forse ci siamo riusciti a regolarizzare il primo messaggio! Scusateci...

Guglielmo

Intanto io ho riguardato

E quelli che credevo errori non lo sono

Io dubito fortemente che quel codice sia quello operativo sull'Arduino.
Vedendo la parte che gira sul PC si vede che c'è la gestione delle accensioni in ms e nel codice esiste la variabile "data" che dovrebbe contenere tutto quello trasmesso tranne il primo carattere che viene usato per il case.
Tuttavia la variabile non viene più usata ma le tempistiche sono cablate nel codice.
Quindi ritengo che il codice che avete per le mani non sia quello caricato sull'Arduino.

fabpolli non puoi esserne certo. Potrebbe essere il programma su PC a calcolare il tempo, e dopo un intervallo di tempo trasmettere il carattere di accensione o spegnimento. In questo caso il codice arduino si limita a ricevere i caratteri come effettivamente fa.

@torn24 in effetti non ci avevo pensato, hai proprio ragione!

@fabpolli dopo questo thread ho cercato di calcolare i millisecondi in C#, e non ci sono ancora riuscito, ci sono esempi ma non ci sono riuscito. Quindi penso non è una cosa proprio facile, o la persona era bravo o faceva in altro modo.

Ma in realtà per calolare i ms in C# bastano poche istruzioni, questo codice a me funziona:

        DateTimeOffset now = DateTimeOffset.UtcNow;
        long unixTimeMillisecondsStart = now.ToUnixTimeMilliseconds();
        Console.WriteLine(unixTimeMillisecondsStart);
        bool bGo = true;
        while(bGo)
        {
        	DateTimeOffset now1 = DateTimeOffset.UtcNow;
        	long unixTimeMillisecondsNow = now1.ToUnixTimeMilliseconds();
        	Console.WriteLine(unixTimeMillisecondsNow);
        	bGo = unixTimeMillisecondsNow-unixTimeMillisecondsStart<30;
        }

Io ho fatto cosi... Ma se metto un intervallo di tempo sotto 100 funziona, se metto un numero superiore non funziona. Siccome la prima volta ho usato il valore 1000 non mi funzionava. Non capisco il perché.

namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            long start = DateTime.Now.Millisecond;
            this.Text = Convert.ToString(start);
            do
            {
                long end = DateTime.Now.Millisecond;
                if (end - start >= 80)
                    this.Text = "Tempo in millesecondi passati!";
            } while (true);
        }
    }
}

**PS col nuovo forum non riesco ad usare correttamente i tag code :slight_smile: **

Basta che scrivi i codice, lo selezioni TUTTO ed usi l'apposito bottone </> che ti mette quello che hai selezionato come codice ... l'ho fatto io qui sopra nel tuo post :slightly_smiling_face:

Guglielmo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.