Che c'è di sbagliato in questo codice?

Che c'è di sbagliato in questo codice?

void setup() {
}
void loop() {
  if (digitalRead(10) == HIGH) {
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }
}

con il codice qui sopra se il bottone non è premuto la lampadina rimane accesa mentre se lo tengo premuto si spegne.

Vorrei fare in modo che se lo tengo premuto la lampadina rimane accesa quando non lo tengo premuto spenta, ma se inserisco questo codice...

void setup() {
}
void loop() {
  if (digitalRead(10) == LOW) {
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }
}

rimane accesa quando il bottone non è premuto mentre quando schiaccio il bottone si accende ancora di più.... Che sbaglio?

ah, sto usando arduino...

Schema di collegamento.
Hai inserito le resistenze di pullup/down?

void loop() {
  if (digitalRead(10) == HIGH) {
     digitalWrite(13, LOW);
  } else {
     digitalWrite(13, HIGH);     
  }
}

Così dovrebbe fare quello che vuoi.

Ciao.

@xoxoxoxoxo: essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto :wink:) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

All'inizio non hai detto ad arduino come deve configurare i pin. Non riconosce da solo se un pin è un ingresso o un'uscita.
Guarda qui

MauroTec:

void loop() {

if (digitalRead(10) == HIGH) {
    digitalWrite(13, LOW);
  } else {
    digitalWrite(13, HIGH);   
  }
}




Così dovrebbe fare quello che vuoi.

Ciao.

No, fa la stessa cosa...

Ciao,
nella funzione void setup dovresti specificare che il pin che stai usando per il pulsante sono di input

pinMode(pulsante,INPUT);

dove pulsante va sostituto con il tuo pin al quale colleghi il pulsante, mentre quelli di output, vedi quello del led che vuoi accendere dovranno essere impostati allo stesso modo sostituendo "INPUT" con "OUTPUT"

ciao, Giovicavalla

Non capisco che succede, ho fatto questo codice per vedere se premendo il bottone stampava qualcosa

void setup() {
  pinMode(8,INPUT);//questo sarebbe il bottone
  pinMode(3,OUTPUT);//questo il led
  Serial.begin(9600);
}


void loop() {
  if (digitalRead(8) == HIGH) {
    Serial.print("HIGH");
     delay(1000);
     digitalWrite(3, LOW);
  } else {
    Serial.print("LOW");
    delay(1000);
     digitalWrite(3, HIGH);     
  }
}

ma quello che succede è che la lampadina si accende e spegne quando io non tocco niente e se tocco il bottone è come se proprio non lo leggesse.

Adesso con fritsing faccio il disegno per vedere se ho fatto giusto nella breadboard.

Ecco qui in allegato.

Ma avevo un'altra domanda
In un altro codice se scrivo pinMode(10, OUTPUT)nel setup la luce è forte se no non lo è così tanto, perché?

Finchè non premi il pulsante il pin di input è flottante perchè non ha una tensione di riferimento.
Quando premi il pulsante invece il pin è collegato a massa quindi segna stato logico basso.
Devi mettere una resistenza di pullup da 10k tra 5V e pin (riga 51 nella breadboard del disegno) in modo che legge stato logico alto quando il pulsante non è premuto.

  1. Quando il bottone NON è premuto, hai una resistenza che tiene il pin ad un livello logico ben definito? Perché i pin in INPUT NON vanno MAI lasciati non connessi ...

  2. Hai messo la resistenza in serie al LED che hai collegato al pin 3 ?

Guglielmo

@pelletta: ci siamo sovrapposti :smiley:

Oppure, lasci il circuito così com'è ed impost la resistenza di pull-up interna all'arduino. Per fare ciò devi settare ad HIGH il pin che hai impostato come ingreesso:

void setup() {
  pinMode(8,INPUT);  //questo sarebbe il bottone

  // forza il pin 8 a livello alto -> abilita la resistenza di pull-up interna ad arduino
  digitalWrite(8, HIGH);


  pinMode(3,OUTPUT);  //questo il led
  Serial.begin(9600);
}

Ciao!

Ciao,
ancora meglio se usi la funzione

pinMode(8,INPUT_PULLUP);

ciao, Giovicavalla

non ho capto nulla :smiley: facciamo passo per passo, cominciamo da questo:
che cosa cambia di preciso se metto
pinMode(8,INPUT_PULLUP); al posto che
pinMode(8,INPUT);
?

e poi adesso sto cercando di fare un altro esercizo ma non mi viene.

void setup() {
  pinMode(3, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  for (int i = 0.0; i < 5; i += 0.1) {
    analogWrite(3, i);
    Serial.print(i);
  }
}

con questo codice sopra nel serial monitor segna 000000000 all'infinito. Mentre se scrivo al posto di Serial.print(i); Serial.print(i+" "); non segna proprio niente... (segna che fa spazi all'infinito) perché?
e perché segna sempre zero e non incrementa?

Perché i è un int, quindi è un intero, per farlo funzionare basta cambiare la dichiarazione e mettere float.

ciao, Giovicavalla

che cosa cambia di preciso se metto
pinMode(8,INPUT_PULLUP); al posto che
pinMode(8,INPUT);

se mastichi un po' l'inglese guarda qui
https://learn.sparkfun.com/tutorials/pull-up-resistors/what-is-a-pull-up-resistor

Sarebbe il caso di risolvere un problema alla volta non ti pare ?

Comunque ... in quest'ultimo programma che hai messo ci sono DUE gravi errori ...

  1. come pensi di poter incrementare di un valore DECIMALE (+0.1) una variabile che hai dichiarato INTERA ? ? ?

  2. la analogWrite() accetta SOLO un numero intero da 0 a 255 e NON numeri decimali (... nel caso ti venisse la voglia di cambiare quel int in float).

Guglielmo

Perché hai dichiarato i come intero, e sommare 0.1 a un intero è come sommargli 0. Passala a double.

@Giovicavalla e SukkoPera: ... ma lo avete letto il codice ? Che cosa consigliate a fare di passare a float o double (... che sono la stessa cosa) quando ... la la usa in una analogWrite() che accetta un intero da 0 a 255 ?

Guglielmo