button e serial print

Salve vorrei sapere come posso fare stampare solo una volta premuto il pulsante il carattere "E".
senza che lui me lo ripeta all'infinito e poi lo devo mandare al programma in python.

Avete idea?
questo è il codice: e l'esempio che si trova in arduino ide.. ho aggiunto solo il print.

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 31;     // the number of the pushbutton pin
const int ledPin =  8;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

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

void loop() {

if(digitalRead(buttonPin) == HIGH){
Serial.print("E");
digitalWrite(ledPin, HIGH);

}else
{
  digitalWrite(ledPin, LOW);
}
}

Grazie mille e buona serata.

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 31;     // the number of the pushbutton pin
const int ledPin =  8;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int buttonStateOld = 0;      // variable salvare stato precedente del tasto

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);

  // initialize the pushbutton pin as an input:

  // **** non attivando l'input come pull-up e sottointeso che devi inserire
  //      tra il pin e la massa 
  //      - una resistenza da 10k per dare un livello stabile
  //      - un condensatore da 100nF per evitare falsi impulsi 

  pinMode(buttonPin, INPUT);
  Serial.begin(9600); 

  buttonState=digitalRead(buttonPin);
}

void loop() {
  buttonStateOld=buttonState;              // salva lo stato precedente
  buttonState=digitalRead(buttonPin);      // legge nuovo stato pulsante

  if (buttonStateOld==buttonState) return; // esce dal loop x nessuna variazione
  
  if(buttonState){
    Serial.print("E");
    digitalWrite(ledPin, HIGH);

  }else
  {
    digitalWrite(ledPin, LOW);
  }

Puoi provare anche così:

//==COLLEGARE IL PULSANTE FRA IL pin buttonPin E GND=============
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 31;     // the number of the pushbutton pin
const int ledPin =  8;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
//==È NECESSARIO DEFINIRE IL pin COME INPUT_PULLUP PER EVITARE INTERFERENZE==
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600); 
}

void loop() {
//==IL TEST SI FA SU LOW============================================
  if(digitalRead(buttonPin) == LOW){
    digitalWrite(ledPin, HIGH);
    delay(30);    //==RITARDO ANTIRIMBALZO==================
    Serial.print("E");
    while (digitalRead(buttonPin) == LOW) ;  //==ATTESA RILASCIO PULSANTE
    digitalWrite(ledPin, LOW);
  }
  //==QUI PUOI INSERIRE UN ULTERIORE RITARDO ALLA SUCCESSIVA PRESSIONE DEL
  //==PULSANTE
  //delay(100);
//==QUESTA PARTE NON SERVE=======================================
//}else
//{
//  digitalWrite(ledPin, LOW);
//}
}

Ciao,
P.

Oppure applichi il debounce utilizzando millis, trovi un esempio qui.

Federico

La buona norma vieta di bloccare l'esecuzione del "void loop()" in attesa che venga rilasciato il tasto.
Si può fare e funziona, ma sottrai tempo utile all'esecuzione del programma, analogamente al comando delay();

Sono d'accordo, ma il livello della domanda posta dall'OP e il fatto che nel suo loop non ci fosse nel frattempo altro da fare, mi ha consigliato la soluzione per lui più comprensibile e sicura. Inoltre non sono sicuro che sia in possesso di una resistenza da 10k e un condensatore da 100nF. Anche l'uso di millis() in questo contesto mi è sembrato prematuro.

Ciao,
P.

Tutti i codici postati vanno certemte bene per lo OP, ma provo anche io, postando un programma banale che fa girare sempre il loop(). Programma scritto su scocciofono

//le variabili citate sono tutte globali
//la setup nonbsi tocca, se non per cambiare il nome alla variabile bottone
void loop()
{
if (digitalRead (bottone))
{
if (ricordo==0)
{
Serial.println ('E');
ricordo=1;
}
}
else
ricordo=0;

//e il controllo del led diventa, tenendo conto che bottone sia INPUT semplice
//e seguendo la prima delle mie tre frasi
dogitalWrite (led, digitalRead (bottone));
}

Non ho antirimbalzi, ma quello o si fa hardware o si ignora il problema, come molti fanno.
Anche se fare una funzione che fa il debounce sw può essere utile per molti progetti, ma richiede millis(), ed é cosa da fare con il tempo.
Vantaggio della mia soluzione: ho usato solo cose che lui ha già usato, delay o millis() le avrei dovute introdurre :slight_smile:

ok , ora provo subito i vostri codici.. e scusate del ritardo ma stavo sistemando il notebook.

Ora vedo e vi ringrazio molto .. l'unico è la parte Python che non so come scrivere la comunicazione tra python e arduino. uso pyserial.

Ora studio e poi vi faro sapere.

grazie mille e buona domenica.

Salve, questo è il mio programma di esempio.. i led riesco ad intercettarli.. ma il pulsante non riesco ad leggere bene con il read.

ecco il codice :

import serial
import time

arduino = serial.Serial('COM3',9600,timeout=0)
time.sleep(2)
arduino.write(b'L')
def main():
    cmd = input("on, off  , blink , button: ")
    if cmd == 'on':
        arduino.write(b'H')
        main()
    elif cmd == 'off':
        arduino.write(b'L')
        main()
    elif cmd == 'blink':
        try:
            while True:
                arduino.write(b'H')
                time.sleep(1)
                arduino.write(b'L')
                time.sleep(1)
        except KeyboardInterrupt:
            arduino.write(b'L')
            time.sleep(1)
            main()
    elif cmd == 'button':
        try:
            while True:
                if arduino.read() == 'E':
                    print("Sono stato premuto")
                else:
                    pass
        except KeyboardInterrupt:
            time.sleep(1)
            main()



if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        arduino.write(b'L')
arduino.write(b'L')
arduino.close()

Come posso fare? , intanto provo il vostro codice e nel frattempo aspetto la risposta per questo.

grazie mille.

Non ho capito in che pinguaggio é scritto quel programma, e che legame cu sia tra esso e

Salve vorrei sapere come posso fare stampare solo una volta premuto il pulsante il carattere "E".
senza che lui me lo ripeta all'infinito e poi lo devo mandare al programma in python.

Avete idea?
questo è il codice: e l'esempio che si trova in arduino ide.. ho aggiunto solo il print.

// constants won't change. They're used here to set pin numbers:

const int buttonPin = 31;    // the number of the pushbutton pin
const int ledPin =  8;      // the number of the LED pin

// variables will change:
int buttonState = 0;        // variable for reading the pushbutton status

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

void loop() {

if(digitalRead(buttonPin) == HIGH){
Serial.print("E");
digitalWrite(ledPin, HIGH);

}else
{
  digitalWrite(ledPin, LOW);
}
}




Grazie mille e buona serata.

lelebum:
La buona norma vieta di bloccare l'esecuzione del "void loop()" in attesa che venga rilasciato il tasto.
Si può fare e funziona, ma sottrai tempo utile all'esecuzione del programma, analogamente al comando delay();

Vero, ma concordo con @pgiagno sul fatto che in questo caso il programma con deve fare altro che leggere lo stato di un pulsante; e poi non demonizziamo il delay, usato con parsimonia e cognizione di causa è molto utile :slight_smile:

Ma qui il problema è un'altro, l'OP evidentemente non ha la più pallida idea di quello che accade quando preme il pulsante, eppure gli bastava aprire l'esempio successivo dell'ide per capirlo; il suo vero problema è inviare un carattere al pitone!

Federico

gigetto1982:
ok , ora provo subito i vostri codici.. e scusate del ritardo ma stavo sistemando il notebook.

Se vuoi imparare, oltre a far girare i "codici", devi capirli, e per capirli devi studiare, cosa che mi pare ti hanno già detto varie volte...

Hai letto l'esempio che ti ho linkato?
Hai capito perchè il tuo codice non funziona?

gigetto1982:
.. l'unico è la parte Python che non so come scrivere la comunicazione tra python e arduino. uso pyserial.

... mi pare che tu abbia solo fretta di fare cose complicate, che complicate non sono se studiassi seriamente e a piccoli passi :frowning:

gigetto1982:
Ora studio e poi vi faro sapere.

si, ma fallo! Lo dici sempre, ma non mi pare tu tu ti stia impegnando :slight_smile:

Con affetto
Federico

gigetto1982:
Salve, questo è il mio programma di esempio.. i led riesco ad intercettarli.. ma il pulsante non riesco ad leggere bene con il read.

se posti il codice arduino, forse qualcuno ti aiuta, ma per il pitone ti consiglio: https://forumpython.it/

Federico

scusa federico66 ma ho lasciato perdere.. e meglio studiare prima invece di partire in quarta..
ho solo fatto due sketch uno con la comunicazione dei led, e un'altro il button .. dove ho postato il codice.

ma studio prima che è meglio e poi lo rifaccio . grazie mille e buona settimana.

gigetto1982:
scusa federico66 ma ho lasciato perdere.. e meglio studiare prima invece di partire in quarta..

Guarda, prenditi dieci minuti e leggiti questo e questo.

Leggili con calma e alla fine sicuramente avrai capito cosa succede quando usi un pulsante e come fare per gestirlo al meglio. C'è anche una soluzione hardware, ma per il momento cerca di capire il problema.

La soluzione software di darà modo di studiare anche come usare millis(), che non guasta.

Federico

ok, grazie mille leggo quelle lezioni, e in più leggo tutto il sito perché ho visto che ha altre lezioni.
ti ringrazio ciao e buona serata.

c'è lo fatta. leggendo un po in italiano e un po in inglese..
vi posto tutto cosi vediamo se miglioriamo la gestione del pulsante che interagisce con python.

arduino

const int buttonPin = 2;
const int ledPin =  53;

unsigned long lastReadTime;
byte readInterval = 12; 
byte buttonState = 0xAA;
byte ledState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  buttonState = (buttonState << 1) | digitalRead(buttonPin);
  if ((buttonState == 1) && (millis() - lastReadTime) > readInterval) { 
    lastReadTime = millis();
    ledState = !ledState;
    digitalWrite(ledPin, ledState);
    Serial.print(ledState);
  }
}

python

import serial
import time

arduino = serial.Serial('COM3',9600,timeout=0)
time.sleep(2)
try:
    while True:
        data = arduino.readline().strip().decode("UTF-8")
        if data == "1":
            print("Ciao!!!!!!!!!!!!!!!!!!!!!!")
        time.sleep(1)
except KeyboardInterrupt:
        time.sleep(1)

ed ogni volta che si prema il pulsante e dopo pochissimo tempo stampa "Ciao!!!!!!!!!!!!!!!!!!!!".

vi ringrazio molto aspetto consigli.

e poi leggo tutto il materiale che ho trovato in un sito che si chiama energia zero che lo trovate su google.

dopo pochissimo tempo

Quel «dopo pochissimo tempo» mi suonava strano.... infatti sleep(1) è troppo, basta sleep(0.01)

E anche la parte Arduino non mi sembra faccia un buon debounce.

in = digitalRead(PULS_PIN);
if (in == in_prec)
{
    t = millis()
}
else if (millis()-t > TDEB)
{
    in_prec = in;
    if (in == PRESS_LEVEL)
    {
        ledState = !ledState;
        digitalWrite(LED_PIN, ledState);
        Serial.write(ledState);
    }
}
import serial
import time

arduino = serial.Serial('COM3', 9600, timeout=0)
try:
    while True:
        if arduino.inWaiting():
            data = arduino.read(1)
            if data[0] == 1:
                print("Ciao!!!!!!!!!!!!!!!!!!!!!!")
        time.sleep(0.01)
except KeyboardInterrupt:
    print("Finito")

Nel caso stessi usando Python2:

if ord(data) == 1:

ok, appena posso provo ti ringrazio molto e buon ferragosto.

EDIT : Uso python 3.