Problème programmation diviseur mécanique

Hello, je suis débutant en Arduino et j'ai une question, je travaille sur un diviseur mécanique avec moteur pas à pas et j'ai un petit soucis. Pour résumé le but de mon programme, on rentre une valeur en degrés grâce au Keypad Arduino et la valide avec la touche A. Ensuite l'Arduino prend la valeur et la multiplie par 6 ( 1 degrés égal à 6 impulsion) et il envoie chaque impulsion avec 1 ms de délais. Si par exemple on rentre 30 degrés et que l'on appuie sur A il fait 30*6=180 impulsion et il comptabilise les degrés si par exemple je réappuie sur A il va refaire 30 degrés mais noté 60. Mon problème c'est qu'une fois arrivé à 360 degrés il continue à compter et j'aimerais qu'il recommencent a partir de zéro. Auriez vous une solution.
Merci beaucoup

 #include <LiquidCrystal_I2C.h>
 #include <Keypad.h>
 
 const byte ROWS = 4;
 const byte COLS = 4;
 char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'.','0','#','D'}
 };

 byte rowPINS[ROWS] = {11,10,9,8};
 byte colPINS[COLS] = {7,6,5,4};

 Keypad kpd = Keypad(makeKeymap(keys),rowPINS,colPINS, ROWS, COLS);
 LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x20 for a 16 chars and 4 line display
                                   // SCL - A5, SDA - A4, VCC - +5, Gnd - Gnd 
 //setup vars-
 const int tour = 360;
 const int ZERO = 0;
 const int stp = 2;               // connect pin 2 to step
 const int dir = 3;               // connect pin 3 to dir
 const int Multiplier = 6;
 const int stepdelay = 1;
 float Degrees = 0;   // Degrees from Serial input
 float ToMove = 0;                 // Steps to move
 float bob = 0;
 float resultat = bob;
 int cho = 0;

 void setup()
 {
 lcd.init();      // initialize the lcd 
 pinMode(stp, OUTPUT);
 pinMode(dir, OUTPUT); 

 // Print welcome message to the LCD.
 lcd.backlight();
 lcd.print(" Diviseur meca");
 lcd.setCursor(4,2);
 lcd.print(" ");
 lcd.setCursor(3,3);
 lcd.print(" DUA 2022");
 delay(2000);
 lcd.init();
   cho = 0;
   char key = kpd.getKey();
   lcd.print("Enter Selection:");   
   lcd.setCursor(0,1);
   lcd.print("Deg=A");
  
   while(cho == 0)
   {
     key = kpd.getKey();
     switch (key)
     {
     case NO_KEY:
      break;
     case 'A':
       Degrees=getdegrees();
       lcd.clear();
       cho = 1;
     
       }      // end case
     }      // end while cho=0
 }    // end setup
 
 void loop()      // MAIN LOOP
 {
   lcd.clear();  
   char key = kpd.getKey();
     bob = 0;
     lcd.setCursor(7,0);lcd.print("Total: ");lcd.print(bob);   // total steps
     lcd.setCursor(0,3);lcd.print("FOR=A REV=B X=C");
    
       
   while(key != 'C')    // C will return to start 
  
 
   {
     lcd.setCursor(0,0);lcd.print(abs(Degrees),2);lcd.print((char)223);
     key = kpd.getKey();
     if(key == 'A')            // FORWARD
       {
        bob = bob + Degrees;
        ToMove = (Degrees*Multiplier);
        digitalWrite(dir, LOW);
        printadvance();
       }
     if(key=='B')              // REVERSE
       {
        bob = bob - Degrees;  
        ToMove = (Degrees*Multiplier);
        digitalWrite(dir, HIGH);    // pin 13
        printadvance();
       }
   }      // end while not C loop
   lcd.init();
  setup();
 }      // end main VOID

float getdegrees()
{ 
   //int key = 0;
   float num = 0.00;
   float decimal = 0.00;
   float decnum = 0.00;
   int counter = 0;
   lcd.clear();
   //lcd.init();
   char key = kpd.getKey();
   lcd.setCursor(0,0);lcd.print("Enter Degrees:");lcd.setCursor(0,1);lcd.print("OK = #     ");lcd.print((char)60);lcd.print((char)45);lcd.print(" D");
   lcd.setCursor(8,1);
   bool decOffset = false;
  

   while(key != '#')
   {
      switch (key)
      {
         case NO_KEY:
            break;
            
         case '.':
           if(!decOffset)
           {
             decOffset = true;
           }
            lcd.print(key);
            break;   
         
         case 'D':
          num=0.00;
          lcd.setCursor(8,1);lcd.print("     ");
          lcd.setCursor(8,1);
          break;
         
         case '0': case '1': case '2': case '3': case '4':
         case '5': case '6': case '7': case '8': case '9':
         if(!decOffset)
         {
            num = num * 10 + (key - '0');
            lcd.print(key);
         }
         else if((decOffset) && (counter <= 1))
         {
            num = num * 10 + (key - '0');
            lcd.print(key);
            counter++;
         }
            break;
      }    //end case
      decnum = num / pow(10, counter);
      key = kpd.getKey();
   }    //end while not #
    return decnum;
}      // end getdegrees
 
 void printadvance()      // print function
   {
     lcd.setCursor(6,1);lcd.print("");
     lcd.setCursor(4,2);lcd.print("");lcd.print(ToMove,0); 
     lcd.setCursor(13,0);lcd.print(bob,2);
     rotation(ToMove,0);
     lcd.setCursor(6,1);lcd.print("");
      if (resultat > 360) {
      resultat = resultat - tour;
      lcd.setCursor(0,0);lcd.print(resultat);
      delay(1000);
     }
     
 
     }   
 void rotation(float tm, int d)
   { 
     for(int i = 0; i < tm; i++) 
       { 
       digitalWrite(stp, HIGH); 
       delay(stepdelay); 
       digitalWrite(stp, LOW); 
       delay(stepdelay); 
       }
   }

void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
  {
  asm volatile ("  jmp 0");  
  } 
  
 
  
saisissez ou collez du code ici

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Oui, c'est la fonction modulo %

		resultat = resultat % 360;

Cordialement
jpbbricole

1 Like

Merci beaucoup

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