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