Leggere chiusura contatto 15 volte ogni due secondi

Il disco ha una freno che lo stabilizzafa a 43 giri al minuto e ogni impulso dura 100mS. il contatto nsi fa 2 impulsi in piú che col nsr vengono inibiti sulla linea telefonica.

Se sai il tedesco é spiegato molto bene qua Nummernschalter – Wikipedia (purtroppo non esiste l'aricolo in italiano e la versione inglese non spiega molto)

Ciao Uwe

Come al solito...non ci ho capito nulla!!! '-.- Io dalla rotella ho 4 fili... Bianco, Giallo, Verde e Marrone... Il telefono è tedesco, molto molto simile a quello su wikipedia nel link di Uwe... Come faccio a contare gli impulsi?

Tiro ad indovinare... Bianco e Verde. :wink: :grin:

Ciao, in genere una coppia era collegata ad un contatto che serviva ad isolare la cornetta, l'altra coppia invece era il contatto che generava gli impulsi, come riporato in questo sito http://www.scuolaelettrica.it/elettronica/telecomunicazioni/telecomunicazioni3/telecom22.shtml.

Ciao.

Devo studiarmi meglio la rotella... Secondo me quella che ho io non fa 9 chiusure del contatto se compongo il 9... è strano... devo vedere!! Intanto grazie per le risposte!! ...Molto utile il link di Freddy65!! :wink:

Allora, facendo delle prove è venuto fuori che: il contatto si chiude due volte in più al numero selezionato.. quindi, se faccio l'uno il contatto si chiude tre volte, se faccio il due si chiude cinque volte e così via... ho provato questo codice

// Contatore

int pulsante =2;
int pulsante2 =4;
int val = 0; 
int val0 =0;
int contatore = 0;
int old_contatore = 0;

void setup() { 
    pinMode(pulsante, INPUT);
    pinMode(pulsante2, INPUT);
    Serial.begin(9600);
}

void loop(){
    if(digitalRead(pulsante)){
        contatore +=1;
    }

    if(digitalRead(pulsante2)){
        contatore -=1;
    }

    if ( contatore == 0 ) {
        Serial.println("pippo");
    }

    if(contatore > old_contatore){
        if ( contatore == 1) {
            Serial.println("2");
        } 
        if ( contatore == 2) {
            Serial.println ("3");
        }
        if ( contatore == 3) {
            Serial.println ("4");
        }
        if ( contatore == 4) {
            Serial.println ("5");
        }
        if ( contatore >=5) {
            val0= contatore + 1;
            Serial.println(val0);
        }
    }

    if(contatore < old_contatore) {
        val = abs(contatore);
        Serial.println(val);
    }

    old_contatore = contatore;    // <<==== !

    delay (200);    // debounce
}

Anche se credo che abbia qualcosa che a me non serve... preso da qui... Aprendo il monitor e facendo girare la rotella non conta... Solo se rallento la rotella col dito riesce a contare... Quindi credo che non riesca a contare per problemi di velocità... Cosa consigliate?!

Diminuisci il delay a 25. 200 è troppo e si "mangia" gli impulsi.

Come posso fare per contare quanti secondi sta chiuso un contatto? Forse e ripeto, FORSE, ho trovato un'altra soluzione... :smiley:
EDIT: Dimenticavo... Modificando il delay non cambia niente... cioè, comincia a contare da quando apro il monitor e non finisce più...

Ti rimando ad un vecchio topic.
--> http://arduino.cc/forum/index.php/topic,106708.0.html
Guarda l'ultimo mio intervento.

PaoloP:
Ti rimando ad un vecchio topic.
--> http://arduino.cc/forum/index.php/topic,106708.0.html
Guarda l'ultimo mio intervento.

Grazie ma non funziona!! Quel codice dovrebbe contare per quanto tempo un pulsante viene premuto? Io in pratica ho due contatti in scambio... sul contatto aperto ho collegato i due fili da arduino e facendo girare la rotella quel contatto si chiude e a seconda del numero resta chiuso più o meno secondi...

Strano. :fearful:
Collega un led con la sua resistenza al pin 9 (vedendo il tuo sito credo che a casa ne abbia un bel pò :grin:), mentre il pulsante al pin 3 con resistenza + una resistenza di pull-down. (Fig. 3 --> Collegare un pulsante ad Arduino | McMajan)

Ricopio qui il codice per chiarezza

// this constant won't change:
const int  buttonPin = 3;    // the pin that the pushbutton is attached to
const int ledPin = 9;       // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
unsigned long t1, t2 = 0;
int durata = 0;
int intervallo=0;

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      t2=millis();
      durata=t2 - t1;
      Serial.print(durata);
    } 
    else {
      t1 = millis();
      intervallo= t1 - t2;
      Serial.print(" : ");
      Serial.println(intervallo);
      digitalWrite(ledPin, HIGH);
      delay(10);
      digitalWrite(ledPin, LOW); 
    }
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;
}

Apri il serial monitor e aziona il pulsante.

Una volta testato il tipo di funzionamento del programma, prova a sostituire il pulsante con il disco combinatore.

EDIT:
Non vorrei ti avesse fuorviato il mio commento

PaoloP:
Tiro ad indovinare... Bianco e Verde. :wink: :grin:

Stavo veramente cercando di indovinare. Prova le varie combinazioni di colori.

Ciao, ma non è meglio attivare l'interrupt sul pin collegato al combinatore e fare in modo che incrementi una variabile ogni volta che cambia stato ?

Ciao.

PaoloP:
Apri il serial monitor e aziona il pulsante.
Una volta testato il tipo di funzionamento del programma, prova a sostituire il pulsante con il disco combinatore.

Fatto, funziona... :slight_smile: grazie!! Ora mi devo mettere lì e devo vedere cosa fare... ovviamente poi bisogna vedere uno quanto tempo ci mette a girare la rotella!! '-.- voglio assegnare ad ogni numero una funzione... quindi per esempio se l'1 ci mette mezzo secondo (in realtà ci mette mooolto meno) io conoscendo il tempo posso assegnare a quel tempo una funzione, giusto?

PaoloP:
Non vorrei ti avesse fuorviato il mio commento

PaoloP:
Tiro ad indovinare... Bianco e Verde. :wink: :grin:

Stavo veramente cercando di indovinare. Prova le varie combinazioni di colori.

No no, tranquillo!! :smiley: guardando le lamelle dei contatti si vede quali sono i colori da scegliere, sotto ci sono i fili saldati!! :slight_smile:

PaoloP:
Collega un led con la sua resistenza al pin 9 (vedendo il tuo sito credo che a casa ne abbia un bel pò :grin:)

hahahaha visto? Si, ne ho davvero un bel po'!!! :smiley:

Rieccomi, ho fatto un po' di prove... Ho modificato il codice postato sopra da @PaoloP ma non sono riuscito ad ottenere quello che volevo...
Volevo, girando la solita rotella del telefono, dare una funzione ad ogni numero... se so che il numero uno si chiude per un tot di tempo, gli faccio fare una cosa.. e così via...
Il codice è il seguente:

// this constant won't change:
const int buttonPin = 8; // the pin that the pushbutton is attached to
const int ledPin = 12; // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
unsigned long t1, t2 = 0;
int durata = 0;
int intervallo=0;
int pippo=0;
void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(9600);
}


void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
t2=millis();
durata=t2 - t1;
Serial.print(durata);
} 
else {
t1 = millis();
intervallo= t1 - t2;
Serial.print(" : ");
Serial.println(intervallo);
}
if (durata >5000)
{
pippo++;
}
if (pippo =1)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW); 
delay(100);
}
}
// save the current state as the last state, 
//for next time through the loop

}
Mi riuscite a dare una mano? Come posso fare? Esempi? Ancora grazie! :D

Correggi if(pippo**==**1)

PaoloP:
Correggi if(pippo**==**1)

Grazie!! Cavolo, l'ho letto proprio stasera che = è un errore... '-.- ma non ci ho pensato...

void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      t2=millis();
      durata=t2 - t1;
      Serial.print(durata);
    } 
    else {
      t1 = millis();
      intervallo= t1 - t2;
      Serial.print(" : ");
      Serial.println(intervallo);
    }

}if (durata >0)
{
pippo++;
}
if (pippo ==1)
{
  digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW); 
      delay(100);
}
  // save the current state as the last state, 
  //for next time through the loop

}

Dovevo spostare anche la posizione del gruppo di if di pippo :smiley: Con un po' di lucidità ci torno a lavorare :smiley:
Ancora grazie!!! :wink:

Pensavo... (strano, ma penso anch'io!! xD ) se io ci metto tot tempo a digitare il 3 un'altra persona ci può mettere meno tempo come ce ne può mettere di più... e mò che faccio? dev'essere adatta a tutti!!! Stavo pensando di crearmi un sistema tutto mio...
In pratica, dietro la rotella, c'è un disco che gira... su questo disco c'è un pezzo di plastica rialzato... su quel pezzo di plastica rialzato ci metto un filo e tutt'intorno ci metto degli altri fili... quando i fili intorno alla rotella, toccano il pezzo di plastica ricoperto dal filo, farà come se fosse un pulsante...
Avete dei consigli? Perchè calcolando il tempo è una cosa impossibile da fare... tutte le volte dovrei gareggiare con la rotella... Dovrei impiegare sempre lo stesso tempo per fare un determinato numero...

Maggio, controlla tutti i connettori della rotella perché una coppia dovrebbe chiudersi mentre la rotella ruota e restare aperta quando la rotella è ferma, o viceversa.
Serviva per distinguere le cifre, ovvero per sapere quando si inviava un 2 o un doppio 1.

Le sto pensando tutte... ma non ci arrivo... allora... a rotella ferma, il contatto che conta gli impulsi è chiuso... poi ci sono degli altri contatti che (credo) sono quelli che lasciano attaccata la "campana" e quando si comincia a girare, si aprono e il centrale di quei contatti si chiude con un altro... non so se mi sono spiegato... il mio problema è che con arduino non riesco a leggere quei contatti che si aprono e si chiudono quando giro la rotella.. si aprono e si chiudono moooolto velocemente!!!