Croquis parfait sur uno ne fonctionne pas sur digispark

bonjour,
2 boutons 2 lignes pour tm1637, faible mémoire utilisée, ce serait idéal sur un digispark (clone)
le digispark : à part faire clignoter des leds et des neopixels sans trop de leds ni d'animations en fonction de la taille mémoire, pas tres utile....sans compter que win7 me rappelle sans cesse que le périphérique USB n'est pas reconnu quand je raccorde le digispark, le televersement est ok cependant
je poste le croquis avec beaucoup de commentaires qui indiquent les endroits qui buggent sous digispark, désolé, vu que c'est une application tres spécifique destiné à etre branché en permanence sur un port usb d'un pc uniquement pour l'alimentation 5volts
Merci

// Frankie Chu’s Library for TM1637 Display 
// Download this library from the GitHub link shown below
// Put it inside the “arduino/libraries” folder
// https://github.com/reeedstudio/libraries/tree/master/DigitalTube //{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
//0~9,A,b,C,d,E,F // Functional for display 

/*
 minuteur  reglable de 15 secondes a 3 minutes
 par pas de 15 secondes si on depasse 3 minutes avec le bouton set 
 il revient a 15 secondes 
 1 afficheur tm1637
 2 boutons + reset a ajouter sur tiny85 et digispark
  test UNO OK
  test tiny85  non testé
  test disgispark bof
  
 */
#include <TM1637.h> 
#include <simpleBouton.h>
// UNO

simpleBouton butt_set(8);
simpleBouton butt_start(9);
#define CLK 4
#define DIO 5
#define Pulse 13 // Alarm Trigger Output 


/*  DIGISPARK TEST FAILED
pour le digispark ne pas changer les pins pour les
boutons poussoirs car les pb3 et pb4 sonr aussi reliés a des resistances
et zener pour les data usb : perturbations sur les niveaux haut et bas
 MEME SI ON ALIMENTE EN 5 VOLTS SANS RELIER A UN PORT USB

simpleBouton butt_set(2);  // 
simpleBouton butt_start(0);
#define CLK 3
#define DIO 4
#define Pulse 1 // Alarm Output et led builtin digispark
*/

/* 
 *  attiny 45/85 : pins au choix( 0 à 4) sauf pb5 (pin 1 physique)
 *  réservée au reset  
 *  8mhz Lfuse :E2  high : DF  ext : FF
 *  8mhz divide by 8 : Low 62  H df ext ff
 *  NON TESTE
 */

/*
simpleBouton butt_set(3);  
simpleBouton butt_start(4);
#define CLK 0
#define DIO 1
#define Pulse 2 // Alarm Trigger Output 
*/
// mettre un bouton reset sur pin1 de l'attiny85 resistance 10k au + 5volts
// bp sur condo 100nf entre pin1 et gnd

int timer_val=0; // variable des minutes
int inter_val=15; // valeur intervalle 
int timer_seconds=30; // valeur de depart differente de zero
// sinon l'alarme s'active a l'allumage
// Variables used to store individual numbers 
int firstnum=0; 
int secondnum=0; 
int thirdnum=0; 
int fournum=0; 
TM1637 tm1637(CLK,DIO); // Create instance of the Display 

void affichetemps() {
   // fonction affichage 

   if (timer_val > 9) { 
      firstnum = timer_val/10%10; 
      secondnum = timer_val%10; 
   } 
   else { 
      secondnum = timer_val; 
   } 
   if (timer_seconds > 9) { 
      thirdnum = timer_seconds/10%10; 
      fournum = timer_seconds%10; 
   } 
   else { 
      thirdnum = 0; 
      fournum = timer_seconds; 
   } 
   // Show countdown on 4 digit 7 segment display 
   tm1637.clearDisplay(); // Clear display 
   if (timer_val > 9) { 
      tm1637.display(0,firstnum); 
   } 
   if (timer_val > 0) { 
      tm1637.display(1,secondnum); 
   } 
    if (timer_seconds > 9 || timer_val > 0) { 
      tm1637.display(2,thirdnum); 
   } 
   tm1637.display(3,fournum); 

      } // end affichetemps

void setup(){ 

   pinMode(Pulse, OUTPUT); 
   digitalWrite(Pulse, LOW); 
   tm1637.init(); // Display Reset 
   tm1637.set(2); // Brightness Level 
   // BRIGHT_DARKEST = 0,BRIGHTEST = 7 BRIGHT_TYPICAL = 2;
   tm1637.point(POINT_ON); // Centre "colons" ON 
  tm1637.clearDisplay();
  // 
  // affichetemps(); 
  // il faut que çà s'arrete ici tant qu'on n'appuye pas sur 
  // le button set ou start
} 
void loop() { 

    //check buttons
    
    butt_set.actualiser();
    butt_start.actualiser();
    
  
    if (butt_set.vientDEtreRelache()) {
    //if (butt_set.vientDEtreEnfonce()) {
      affichetemps();
      delay(10);
      timer_seconds=timer_seconds + inter_val;
      /* si on depasse 59 sec timer_val doit etre mis a 1
       *  et timer_seconds à zero
       */
      if (timer_seconds > 59) 
      { timer_val= timer_val+1;
      timer_seconds=0; }
      if ( timer_val==3 && timer_seconds > 0 )
      { timer_val=0; timer_seconds=inter_val; } // si on dépasse 3 min
      // revient valeur initiale
       
    }

      if (butt_start.vientDEtreRelache()) {
    //if (butt_start.vientDEtreEnfonce()) {
      do {
        affichetemps();
   timer_seconds=timer_seconds-1; 
   delay(1000); // Delay of 1 second 
    if (timer_seconds == -1) { 
      timer_val=timer_val-1; 
      timer_seconds=59;      
      }  
          }
    while (timer_val > 0 || timer_seconds > 0);
           }
   // Check if timer is elapsed  
   // buzzer+aff 0000  on/off 5fois
   
   if (timer_val == 0 && timer_seconds == 0) { 
     for (int i=0; i <= 5; i++) // on effectue 5 fois ok
     {
      tm1637.clearDisplay(); // Clear display 
      tm1637.display(0,0); 
      tm1637.display(1,0); 
      tm1637.display(2,0); 
      tm1637.display(3,0); 
      digitalWrite(Pulse, HIGH); // Alarm Trigger ON 
      delay(1000);  // Wait
      
      tm1637.clearDisplay(); 
      digitalWrite(Pulse, LOW); // Alarm Trigger OFF
      
      delay(500); // Wait
     }
        timer_val=0;
        timer_seconds = 30; //  
         affichetemps();  // en placant la fonction ici
         // la valeur ne s'affiche pas au reset/demarrage, juste les 2 points restent allumés
         // indique que le module est sous tension : appui set la valeur s'incremente du pas 15 (choix de la compilation)
         // appui start sans passer par set : affiche 30 puis décompte, apres la fin de l'alarme réaffiche 30
         // ce qui est mon choix, pour éteindre l'afficheur appui sur reset
         // améliorations possibles : enclencher un relais pendant le décompte
         // enregistrer la valeur choisie par set au moment de l'appui sur start 
         // ce serait cette valeur qui se réafficherait a la fin de l'alarme
         // des croquis dans ce sens sont disponibles sur le web
         // ne fonctionne pas sur digispark, pas testé sur attiny85 sans bootloader
         } 
   
        //affichetemps();  
        // si on le place ici le temps s'affiche au reset
        // 
    
    
      } // end loop

J'ai mis le code entre balises.
Merci de respecter les règles du forum

merci pour la correction, j'avais mis entre

blocquote "
blockquote et c'était entre Preformatted text qu'il faut le temps que je m'habitue au nouveau forum
désolé
test </>

case 11:
      ToutesLED(255,255,0);
      delay(300);
    break;    

Je ne comprends pas ce qui ne fonctionne pas sur digispark.

Bonjour,

Je viens d'essayer sur une digispark et ça fonctionne.
Du moins ça fonctionne de la même façon que sur une uno car il y a des choses qui fonctionnent bizarrement dans ton programme.

Merci pour votre temps

sur uno : au demarrage : affiche éteint, si appui sur start affiche 30 et decompte de 30 a zero 29,28, .....0, fait buzzer et clignoter l'afficheur un petit temps on/off puis réaffiche 30, si reset l'afficheur s'éteint sauf les 2 points et attend appui sur start ou set

                                                             si appui sur set  ajoute 15 a 30 affiche 45 etc... c'est choix perso

sur digisark : affiche directement 30 et decompte sans appui, le set ajoute des temps anarchiquement comme si il n'y avait pas d antirebonds, vu ce que j'ai lu sur le forum digistump, ce n'est pas exceptionnel....les bugs
je dois juste essayer un attiny85 sans usb, sans bootloader, sinon je me contenterais d'un promini
Merci à vous pour les tests

Chez moi ça fait exactement la même chose sur uno et digispark.
Est ce que tu as bien des résistances de pulldown (ou pullup) sur les boutons?

Il n'y a pas de raison pour que ça ne fonctionne pas sur un attiny85 sans booloader.

bonjour,
normalement il n'y a pas besoin de résistances pullup : j'ai testé avec et sans , simplebouton met les pull_up internes en fonction
il y a un truc non parfait meme sur l'uno : testé un attiny85 sans boot ni usb fait exactement comme uno
a la fin du loop suivant l'endroit où est placée la fonction affichetemps :

au reset l'afficheur éteint les chiffres et laisse les 2 points allumés
appui sur start ok affiche 30 et decompte, mais si j'ai fait SET pour choisir une autre durée, quand j'appuie sur start il ajoute +inter_val avant de décompter, si j'ai mis 45 j'appuie start il affiche 1:00 et decompte

soit au reset l'afficheur ne s'éteint pas il revient a l'affichage 30 que j'ai choisi et si je fais set a 45 puis start il decompte a partir de 45, fonctionnement recherché

void loop() { 

    //check buttons
    butt_set.actualiser(); // test butt_set (boucle ? )
    butt_start.actualiser();

  
    if (butt_set.vientDEtreRelache()) {
    //if (butt_set.vientDEtreEnfonce()) {
      affichetemps();
      //delay(10);
      timer_seconds=timer_seconds + inter_val;
      /* si on depasse 59 sec timer_val doit etre mis a 1
       *  et timer_seconds à zero
       */
      if (timer_seconds > 59) 
      { timer_val= timer_val+1;
      timer_seconds=0; }
      if ( timer_val==3 && timer_seconds > 0 )
      { timer_val=0; timer_seconds=inter_val; } // si on dépasse 3 min
      // revient valeur initiale
     //  
              }
   // 
      if (butt_start.vientDEtreRelache()) {
    // countdown en cours jusque valeurs 00:00
      do {
        affichetemps();
   timer_seconds=timer_seconds-1; 
   delay(1000); // Delay of 1 second 
    if (timer_seconds == -1) { 
      timer_val=timer_val-1; 
      timer_seconds=59;      
      }  
          }
    while (timer_val > 0 || timer_seconds > 0);
           }
   // Check if timer is elapsed  
   // buzzer+aff 0000  on/off 5fois
   
   if (timer_val == 0 && timer_seconds == 0) { 
     for (int i=0; i <= 5; i++) // on effectue 5 fois ok
     {
      tm1637.clearDisplay(); // Clear display 
      tm1637.display(0,0); 
      tm1637.display(1,0); 
      tm1637.display(2,0); 
      tm1637.display(3,0); 
      digitalWrite(Pulse, HIGH); // Alarm Trigger ON 
      delay(1000);  // Wait
      
      tm1637.clearDisplay(); 
      digitalWrite(Pulse, LOW); // Alarm Trigger OFF
      
      delay(500); // Wait
     }
        timer_val=0;
        timer_seconds = 30; //  
         //affichetemps();  // si place ici le bouton start ajoute 1x inter_val
        // avant de décompter SI ON A MODIFIE LE TEMPS AVEC SET
        // pourquoi ?
         } 
   
        affichetemps();  // l'affichage ne s'éteint pas au reset si placé ici
    // faut il actualiser les boutons quelque part ?
    
      } // end loop


je pourrais remplacer le bouton reset que j'ai déporté en face avant par un bouton poussoir on/off mecanique qui coupe le +5volts et le probleme serait réglé, il doit bien y avoir une solution software

désolé pour ces longues explications et merci

maj : avec des pullup externe sur bp çà fonctionne sur digispark, pas comme je voudrais au reset, je vais mettre un interrupteur, il faudra attendre 5 secondes à l'allumage avant que n'apparaisse l'affichage et appui sur set ou start

fin et merci

J'ai l'impression que tes boutons sont cablés au +5V alors que la librairie simpleBouton est faite pour des boutons cablés au GND.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.