Go Down

Topic: Arduino-Tiny Attiny85 Funzione mills (Read 3181 times) previous topic - next topic

leo72


leo72   ;)  Non voglio la pappa pronta !  :D

Tranne che in rari casi, da me non la ottieni.  ;) Non hai idea di quanto MALE faccia farsi fare il codice da altri:
1) non lo capisci
2) dato che non lo capisci, ti porta apprendimento pari a 0,1
3) dato che non ti ha insegnato nulla, domani sarai nuovamente a chiedere aiuto.

Sulle cose bisogna sbatterci il proprio capo, non quello degli altri, solo così le si imparano pian piano.


nid69ita

Ahhhhhh, che brutte tutte quelle righe vuote!!! E a che serve indentare ?     :D
my name is IGOR, not AIGOR

waterseven

Quella è la versione comprensibile da tutti  ;) , poi ho la versione min senza commenti e quant'altro  :D

nid69ita

No, no i commenti mai toglierli !!! Quelli vanno bene, anzi sono fondamentali. Tra 1 anno voglio vederti a leggere il tuo codice senza commenti e rammentarti che cavolo fa.  :smiley-mr-green:
my name is IGOR, not AIGOR

PaoloP

Leva solo i commenti inutili tipo
Code: [Select]
Serial.print(F("Fase 2")); // Stampo inizio fase 2
Insomma.. cose che si comprendono al volo anche senza commento.

E prima di pubblicare usa la formattazione automatica. Menù strumenti dell'IDE.

waterseven

#21
Jul 04, 2013, 12:56 pm Last Edit: Jul 04, 2013, 01:00 pm by waterseven Reason: 1
Della formattazione non lo sapevo !! Ottimo! Sono un webmaster(di professione) quindi macino parecchi commenti al giorno sulle milioni di righe di codice php query js e quant altro , di quel programma ho cmq gli sketch salvati in locale , quello che carico su attiny è ripulito per ridurre lo spazio occupato !

leo72


di quel programma ho cmq gli sketch salvati in locale , quello che carico su attiny è ripulito per ridurre lo spazio occupato !

Un commento non occupa spazio.
Il compilatore toglie tutta la roba inutile prima di creare l'eseguibile.

Quindi 1 riga di codice con 100 righe di commento ed 1 riga di codice senza commenti occupano esattamente lo stesso spazio.

Segui il consiglio, commenta tutto quello che è poco oltre il "banale" come nell'esempio di Paolo, perché anche prima di 1 anno, fra 3 mesi, apri il programma e non sai più che fa  ;)

PaoloP


Il compilatore toglie tutta la roba inutile prima di creare l'eseguibile.


A volte anche la roba utile.  :smiley-mr-green:
Leggasi bug dell'IDE o variabili non dichiarate volatile

waterseven

#24
Jul 04, 2013, 06:40 pm Last Edit: Jul 04, 2013, 06:42 pm by waterseven Reason: 1
Ho un problema legato all' attiny che non riesco a risolvere , in foto allegata il circuito.

Praticamente se io collego l'alimentazione( collegamenti controllati ed è tutto ok),sul pin 4 va in lettura per vedere se il bottone è premuto , per fare una prova faccio io il contatto direttamente con 5v sul pin4 seguendo la combinazione ma è come se non lo rilevasse .... Ho provato cosi ha mettere la gnd in comune con la millefori(quella bianca) su cui avevo il bottone di prova , ho provato con il bottone sul pin 4 è il relè si accende.E questo è il primo problema che non mi spiego , il secondo è che se controllo la tensione appena la scheda è alimentata, sul pin 3 (che controlla il transistor, che per altro ora nello scrivere mi son accorto di un errore ... mettere la resistenza prima della base ....) la tensione è 0 , quando effettuo la combinazione e si avvia success() tempo 1 secondo l'uscita deve andare in low ma il relè rimane acceso comunque, cosi controllando il pin 3 ho una tensione di 0.32 invece che 0 e non me lo spiego (Quindi il transistor fa passare la gnd sull' in1 del modulo relè, che sia la resistenza prima della base mancante?)

leo72


Ho provato cosi ha mettere la gnd in comune con la millefori(quella bianca) su cui avevo il bottone di prova , ho provato con il bottone sul pin 4 è il relè si accende.E questo è il primo problema che non mi spiego ,

Se il pulsante è su un circuito e l'Attiny ed i relé su un altro, le masse vanno messe in comune altrimenti mancano i riferimenti dei livelli di tensione e non funziona nulla.

Quote

il secondo è che se controllo la tensione appena la scheda è alimentata, sul pin 3 (che controlla il transistor, che per altro ora nello scrivere mi son accorto di un errore ... mettere la resistenza prima della base ....) la tensione è 0 , quando effettuo la combinazione e si avvia success() tempo 1 secondo l'uscita deve andare in low ma il relè rimane acceso comunque, cosi controllando il pin 3 ho una tensione di 0.32 invece che 0 e non me lo spiego (Quindi il transistor fa passare la gnd sull' in1 del modulo relè, che sia la resistenza prima della base mancante?)

Serve codice e circuito.

waterseven

Sisi lo so di tutto il circuito le gnd sono in comune, allora mi son messo a giocare di nuovo manualmente e ho capito che sbagliavo i tempi , funziona ora rimane il problema della tensione di attiny ossia dopo aver messo in high l'uscita e attivato il transistor quando riva in low rimane una tensione di 0,32 v e quindi il transistor bc457 rimane attivo e il relè anche.
A breve incollo codice e schema , il tempo di farlo comprensibile per i comuni mortali  :smiley-red: ...

waterseven

Allora questo è il codice che uso:
Code: [Select]

const int pinButton = 4; // Pin bottone
const int pinGate = 3; // Pin 3 Cancello
int lastState=0;
double combo[3]; // Combinazione di 3 push
double lastPush; // Ultimo push
long duration;

void setup()
{
  pinMode(pinGate, OUTPUT); // Dichiaro pinGate come OUTPUT
  pinMode(pinButton, INPUT); // Dichiaro pinGate come INPUT
}

void loop()
{

  // Leggo stato bottone citofono
  int buttonCit = digitalRead(pinButton);   

  // Se il bottone è in stato diverso dal precedente
  if (buttonCit != lastState)
  {
    //Controllo se è in stato alto
    if (buttonCit == HIGH ){
      Reg(); // Registro in combo il momento in cui viene avvertito il push
      Check(); // Controllo se la sequenza e' completa*/
      delay(400);  // Aspetto per non sovraccaricare il buffer
    }
  }

  // Sequenza cominciata ma oltre 4 secondi di silenzio: resetto
  if ( combo[0] && millis()-lastPush > 4000 ) {
    reset();
  }

}

// Registro il momento in cui viene premuto il bottone
void Reg()
{
  double time = millis();
  lastPush = millis();

  if ( combo[0]==0 ) {
    combo[0] = time;
    return;
  }

  if ( combo[1]==0 ) {  //QUI DEVO AGGIUNGERE IL CODICE DEL PUSH PER 2 SECONDI SE VERO FAI IL RETURN ALTRIMENTI RESET
    combo[1] = time;
    while(digitalRead(pinButton) == HIGH){ // wait while the switch is still pressed
      duration = millis() - combo[1] ;
    }
    if(duration > 1000){
      return;
    }
    else{
      reset();
    }
  }

  if ( combo[2]==0 ) {
    combo[2] = time;
    return;
  }

}

void Check()
{
  // Se c'e' il numero corretto di push registrati
  if ( combo[2] > 0 )
  {   
    // Verifica il "ritmo" della sequenza di battiTO
    if ( combo[1]-combo[0] >= 500 && combo[1]-combo[0] <= 2000 ) // 250{
      if ( combo[2]-combo[1] >= 500 && combo[2]-combo[1] <= 5000 ) // 250
          success();

    // Resetto la combo ogni volta che ha completato la sequenza
    reset();
  }
}

//Resetto tutto
void reset()
{
  for ( int n=0; n<=2; n++ ) {
    combo[n] = 0;
  }
  digitalWrite(pinGate,HIGH);

}

void success()
{
  digitalWrite(pinGate,LOW);
  delay(1000);
  reset();
}



In allegato il pcb , se occorre vi faccio lo schema

leo72

Serve lo schema.

Non ho guardato attentamente tutto il codice ma noto un grosso errore. Millis si salva in una variabile di tipo unsigned long, non in una double che serve a gestire i numeri in virgola mobile e che oltretutto non esiste neanche sull'Arduino perché double ha la stessa dimensione (e precisione) di un float, 4 byte.

waterseven

Provvedo a cambiare in dobule grazie per la dritta , qui cè lo schema del mio progetto

Go Up