Generare onda quadra da un Analog Out e riceverla da un Analog In?

Buonasera a tutti,
premetto che sono nuovo per quanto riguarda la programmazione che Arduino.
Sto progettando un circuito in grado di controllare il livello d'acqua di una cisterna tramite delle sonde e una pompa.
Avrei bisogno di sapere se e' possibile ( se si', come) generare un segnale (emettitore) analogico ( es. onda quadra) e nello stesso tempo, se questo segnale viene rilevato da un Ingresso Analogico, mi dia consenso ad attivare delle uscite ( es. accensioni LED, pilotaggio transistor, etc..).
Sto incontrando delle difficolta' nel creare questo segnale: potrei generarlo con un 555, ma vorrei sapere se arduino e' in grado di svolgere questi 2 funzioni nello stesso tempo.
Avrei anche bisogno di sapere in questo caso, come applicare la funzione millis, per creare questo segnale.
Grazie in anticipo :slight_smile:

Con la funzione tone si può far emettere una frequenza (ad onda quadra) da un pin qualsiasi. Si può specificare se per un certo tempo, oppure in continuazione (e per fermarla allora va usata la funzione noTone). L’esecuzione di tone va avanti da sola in parallelo con il resto.

Un pin analogico legge una tensione continua compresa tra 0 e Vrif (normalmente i +5V) e la converte in un valore da 0 a 1023.

Se si vuole rileggere la presenza dell’onda quadra, questa andrà rettificata e filtrata.

Per queste specifiche operazioni non serve scomodare millis.

grazie per il suggerimento :slight_smile:
Sto provando a far accendere un led (da un uscita digitale) chiedendo ad Arduino di accenderlo se un suo ingresso Digitale risulta alto.
Il led mi rimane acceso,il pin 8 mi rimane attivo, indipendentemente dal valore del pin n.3 che funge da “emettitore”.
Metto in allegato lo schema elettrico e le istruzioni

-sto sfruttando un ingresso digitale per un segnale ad onda quadra (ahime’!).
Non mi interessa leggere questo segnale per scopi particolari, non devo fare alcune misurazioni, l’obiettivo e’ riuscire a far leggere ad arduino che un segnale comunque sta arrivando all’ingresso.

Ecco il listato:

int emettitore = 3;
int ingresso = 12;
int led = 8;


void setup() {
  // put your setup code here, to run once:
 pinMode(emettitore, OUTPUT); // segnale analogico che Arduino invia
 pinMode(ingresso, INPUT); //  segnale onda quadra  ricevuto da Arduino
 pinMode(led, OUTPUT); // led d'uscita

}

void loop() {
  // put your main code here, to run repeatedly:
tone(emettitore,10);    // segnale ad onda quadra di 10 Hz
{
if (digitalRead(ingresso = HIGH));   // se  l'ingresso e' alto
{
  digitalWrite(led, HIGH);   // il led si accende
}
}
if (digitalRead(ingresso) == LOW) // se l'ingresso e' basso
  {
    digitalWrite(led, LOW); // il led si spegne
  }
}

Scusatemi per la totale inesperienza al riguardo. :cold_sweat:

Claudio_FF:
Con la funzione tone si può far emettere una frequenza (ad onda quadra) da un pin qualsiasi. Si può specificare se per un certo tempo, oppure in continuazione (e per fermarla allora va usata la funzione noTone). L’esecuzione di tone va avanti da sola in parallelo con il resto.

Un pin analogico legge una tensione continua compresa tra 0 e Vrif (normalmente i +5V) e la converte in un valore da 0 a 1023.

Se si vuole rileggere la presenza dell’onda quadra, questa andrà rettificata e filtrata.

Per queste specifiche operazioni non serve scomodare millis.

Christian, inserisci il codice nel messaggio come testo tra code e /code, cliccando sull'icona in alto a sinistra dell'editor completo del forum (usa Modify) e, per cortesia, indenta bene le righe affinché si capisca la struttura del programma.
Grazie

>christian3280: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (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 avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

christian3280:
l'obiettivo e' riuscire a far leggere ad arduino che un segnale comunque sta arrivando all'ingresso

La funzione tone non può generare frequenze inferiori a 31Hz.

Diciamo che va bene per generare dei toni nella banda audio.

In questo specifico test può anche essere scritta nel setup senza chiamarla ad ogni giro di loop, una volta avviata la frequenza continua da sola.

Hai scritto due diversi if:

if (digitalRead(ingresso = HIGH));   // se  l'ingresso e' alto
if (digitalRead(ingresso) == LOW) // se l'ingresso e' basso

Uno dei due contiene due errori (non sintattici ma semantici, non fa quello che pensi)

Se due if separati testano ciascuno la condizione opposta all'altro, allora ne basta uno solo con else.

ok, ho provato a fare come dici, usando la funzione Else, e ho settato la frequenza a 40 Hz.
Non ho alcun errore di codice, ma il risultato e’ sempre lo stesso: mi ritrovo l’uscita del led (pin 8 ) sempre attiva, indipendentemente dallo stato dell’ingresso. Come mai?
Aggiorno qui di seguito il listato:

int emettitore = 3;
int ingresso = 6;
int led = 8;


void setup() {
  // put your setup code here, to run once:
 pinMode(emettitore, OUTPUT); // segnale analogico che Arduino invia
 pinMode(ingresso, INPUT); //  segnale onda quadra  ricevuto da Arduino
 pinMode(led, OUTPUT); // led d'uscita
tone(emettitore,40);    // segnale ad onda quadra di 10 Hz
}

void loop() 
  // put your main code here, to run repeatedly:
{
if  (ingresso = HIGH){
  digitalWrite(led, HIGH);
}
else if(ingresso = LOW){
  digitalWrite(led, LOW);
}
}

Claudio_FF:
La funzione tone non può generare frequenze inferiori a 31Hz.

Diciamo che va bene per generare dei toni nella banda audio.

In questo specifico test può anche essere scritta nel setup senza chiamarla ad ogni giro di loop, una volta avviata la frequenza continua da sola.

Hai scritto due diversi if:

if (digitalRead(ingresso = HIGH));   // se  l'ingresso e' alto

if (digitalRead(ingresso) == LOW) // se l’ingresso e’ basso



Uno dei due contiene due errori (non sintattici ma semantici, non fa quello che pensi)

Se due if separati testano ciascuno la condizione opposta all'altro, allora ne basta uno solo con else.

Non stai leggendo l'ingresso (non ci sono digitalRead da nessuna parte).

if (ingresso = HIGH){

if  (ingresso == HIGH){

Datman:
if (ingresso = HIGH){

if  (ingresso == HIGH){

L'assegnamento vs uguaglianza era l'errore successivo :wink:
Il primo problema è che 'ingresso' è una variabile che indica il pin, non il valore letto dal pin.
La partenza è sempre dura... :cold_sweat:

Ciao! A parte come ti è stato detto non stai leggendo l'ingresso del pin, devi comunque usare la funzione
digitalRead() e l'operatore di confronto ==;

A parte i problemi di programmazione vorrei fare notare un problema della natura umana :slight_smile: Se il led si accende e spegne con una frequenza di 40 herz, l'occhio umano non può percepire la cosa.

Inoltre vorrei sapere cosa usa come trasduttore tra l'uscita di arduino e la vasca

E tra la vasca e l'ingresso di arduino

Il vero problema è li, resto è solo software, che si mette a posto...

torn24:
Se il led si accende e spegne con una frequenza di 40 hertz, l'occhio umano non può percepire la cosa.

Ma se si spegnesse come richiesto, sarebbe evidente. Per come è scritto il programma, però, non può accadere.

Dipende da cosa sente

Se il sensore sente (e riporta sull’ingresso) ogni singola onda quadra il led lampeggerebbe alla frequenza di 40 Hz, che sarebbe acceso fisso, per i nostri occhi

E torniamo alla mia domanda: sensori e trasduttori?

Sì, è vero, ma aveva scritto:
"Sto provando a far accendere un led (da un uscita digitale) chiedendo ad Arduino di accenderlo se un suo ingresso Digitale risulta alto."

Beh... Pausa. :slight_smile:

Voglio ringraziarvi innanzitutto per il vostro supporto, devo fare delle precisazioni ( magari sono stato poco chiaro):

  • il circuito che voglio creare con Arduino deve, indipendentemente da qualsiasi stato degli ingressi, mandarmi in una cisterna d'acqua un segnale Alternato. Il motivo per cui ho bisogno che sia alternato, e' a causa dell'elettrolisi: la corrente continua favorisce il formarsi di calcare.
  • Non ci sono trasduttori: il circuito deve funzionare con delle normali sonde ad immersione. Ho lavorato per un azienda che faceva controlli di questo tipo, usavano degli integrati per creare dei segnali ad onda quadra e tramite delle normalissime sonde( semplici conduttori, niente di più'), riuscivano a trasmettere questo segnale che ritornava a questi integrati . Sto parlando di NE555 e porte NAND nello specifico.
  • Con le istruzioni che al momento do ad Arduino, il Led rimane acceso, anche se provassi a togliere l'emettitore il risultato non cambia : il pin 8 ( OUTPUT per il led rimane attiva).

Magari sto facendo troppa confusione, ma...: Portando un segnale alternato ad un ingresso digitale, sono in grado di "prendere in giro" il microcontrollore? Please Help :sweat_smile:

Il led non sta lavorando in funzione dell'ingresso analogico.

int emettitore = 3;
int ingresso = 6;
int led = 8;


void setup() {
  // put your setup code here, to run once:
 pinMode(emettitore, OUTPUT); // segnale analogico che Arduino invia
 pinMode(ingresso, INPUT); //  segnale onda quadra  ricevuto da Arduino
 pinMode(led, OUTPUT); // led d'uscita
tone(emettitore,40);    // segnale ad onda quadra di 10 Hz
}

void loop() 
  // put your main code here, to run repeatedly:
{
if  (digitalRead(ingresso = HIGH)){
  digitalWrite(led, HIGH);
}
else if (digitalRead(ingresso = LOW)){
  digitalWrite(led, LOW);
}
}

Hai letto sopra?... Sembra di no! :slight_smile:

Riassunto delle puntate precedenti (e qualcosa in più):

  1. Negli if devi usare ==.

  2. Devi scrivere if(digitalRead(ingresso)==HIGH) {}.

  3. Se l'ingresso rimane aperto, lo stato è indeterminato, perciò dovrà esserci una resistenza tra 10 e 47kOhm verso massa.

  4. digitalRead è una lettura digitale, non analogica, perciò rileva solo la presenza o l'assenza del segnale.

  5. Se il segnale è a 40Hz, con quel semplice programma il LED lampeggerà a 40Hz. Per avere uno stato stabile, devi accendere il LED appena rilevi il segnale e spegnerlo se il segnale rimane assente per un tempo maggiore del semiperiodo del segnale (1/40=25ms: puoi usare tranquillamente 100ms o anche 500ms).

  6. Se il segnale, passando nell'acqua, arriva con un livello minore di 4V, devi rilevarlo usando un ingresso analogico e scrivendo if(analogRead(A0)>X) {} dove X è il valore minimo che indica la presenza dell'acqua.

Sei stato abbastanza chiaro cosi'. Avevo frainteso un tuo messaggio precedente:

Datman:
if (ingresso = HIGH){

if  (ingresso == HIGH){

Provero' a fare queste modifiche e vi faro' sapere.
Grazie mille per ora!

Prego :slight_smile: