retranscription d'une code d'automate sur arduino

bonjour tout le monde

je suis en train de faire une nouvelle machine, et je voulais lui mettre un arduino en guise d'automate

j'ai une fonction a retranscrire

dim encoche(5)
dim i is an integer


sub vidage()

for i=1 to 5
encoche(i) = 0
next i
end sub

donnerais

dim encoche(5) // là je suis pas sur du tout
int dim i    // là je suis pas sur du tout

void vidage()

for i=1 to 5
encoche(i) = 0;
next i;

ensuite

sub gestionencoche()

for i = 1 to 5
encoche (6-i) = encoche(5-i)
next i
dumpencoche()
end sub

donnerais

void gestionencoche()

for i = 1 to 5
encoche (6-i) = encoche(5-i);
next i;
dumpencoche();

ensuite

sub dumpencoche()
for i=1 to 5
setmbbit 319+i, encoche(i)
next i
end sub

donnerais

dumpencoche()
for i=1 to 5
setmbbit 319+i, encoche(i);  // là on memorise les encoche(i) sur l arduino, et je ne sais pas faire cela
next i;

en fait ces fonctions servent à creer une tableau de memorisation des etats d'encoche sur une table tournante, soit l encoche est plein 1 ou vide 0

et la table tourne d'un cran, donc on doit decaler le tableau de une ligne, mettre à 0 la derniere encoche qui sort du tableau, et decider ce que va devenir la premiere encoche du tableau

cela fait appel a des fonctions que je ne maitrise pas sous arduino, j ai mis 3 stagiaires crsa dessus qui seche

Bonjour,

Qu'est ce que tu veux faire?
Traduire une programme basic en C++ pour le faire tourner sur un arduino?

vi

un truc dans ce genre ?

bool encoche[5]; 
#define base_pin 5 //pin choisie arbitrairement !

void vidage()
{
    for( int i=0; i<5; i++)
    {
        encoche[i] = false;
    }
}


void gestionencoche()
{
    for( int i=0; i<5; i++)
    {
     encoche[5-i] = encoche[4-i];
    }
    dumpencoche();
}

void dumpencoche()
{
 for( int i=0; i<5; i++)
    {
     // setmbbit 319+i, encoche(i);
     //ici par contre je ne connais pas l'instruction utilisée mais
     //vu son nom je pense qu'on positionne un bit dans un registre en 
     //fonction de la valeur de encoche[i]
     digitalWrite(base_pin+i, encoche[i]);
 }
}

en revanche rien ne rempli le tableau encoche[] dans ce code. il sera donc toujours à false partout

alors, en fait le tableau se rempli à l encoche 1, on met une sonde, si quelque chose est present, on rempli à true

sinon on laisse a false

on est en train de faire un petit montage simple avec bouton et relais pour simuler la table

du coup, je suis pas persuader que le dumpencoche serve vraiment a quelque chose

il semblerait que c est une memorisation du tableau, en cas de coupure de courant, ce qui dans notre cas ne sert a rien

vous confirmez?

bricofoy:
un truc dans ce genre ?

bool encoche[5]; 

#define base_pin 5 //pin choisie arbitrairement !

void vidage()
{
    for( int i=0; i<5; i++)
    {
        encoche[i] = false;
    }
}

void gestionencoche()
{
    for( int i=0; i<5; i++)
    {
    encoche[5-i] = encoche[4-i];
    }
    dumpencoche();
}

void dumpencoche()
{
for( int i=0; i<5; i++)
    {
    // setmbbit 319+i, encoche(i);
    //ici par contre je ne connais pas l'instruction utilisée mais
    //vu son nom je pense qu'on positionne un bit dans un registre en
    //fonction de la valeur de encoche[i]
    digitalWrite(base_pin+i, encoche[i]);
}
}




en revanche rien ne rempli le tableau encoche[] dans ce code. il sera donc toujours à false partout

merci et lol ta signature

comment on fait pour printer encoche(i)?

Serial.print(encoche(1)); ne marche pas

Serial.print(encoche(1)); ne marche pas
Essayez
Serial.print(encoche[1]);

( .. ) servent à appeler des fonctions, entre autres, et à garder des expressions lisibles
[ .. ] servent à indicer des tableaux...

Au fait: quels sont les défauts de mouvement (ça ne se compile pas -j'espère- ou ça fait n'importe quoi?)

Bonjour vtec35

vtec35:
comment on fait pour printer encoche(i)?

Serial.print(encoche(1)); ne marche pas

Cordialement,
bidouillelec

qu apel tu defaut de mouvement?

vtec35:
qu apel tu defaut de mouvement?

"Serial.print(encoche(1)); ne marche pas"

ne marche pas ==> défaut de mouvement :drooling_face:

a ok, ça ne se compile pas

sinon voici notre code de test

#define entree_inter  9


bool encoche[5];
//#define base_pin 5 //pin choisie arbitrairement !

void vidage()
{
for( int i=0; i<5; i++)
  {
    encoche[i] = false;
  }
}
void gestionencoche()
{

  for( int i=0; i<5; i++)
  {
    encoche[5-i] = encoche[4-i];
  }

}

 /*void dumpencoche()
{
  for( int i=0; i<5; i++)
  {
      //setmbbit 319+i,encoche(i);
      //ici par contre je ne connais pas l'instruction utilisée mais
      //vu son nom je pense qu'on positionne un bit dans un registre en
      //fonction de la valeur de encoche[i]
      digitalWrite(base_pin+i, encoche[i]);
  }
}*/

void setup() {
pinMode (entree_inter,INPUT);
  vidage();
  Serial.begin(115200);
}

void loop ()
{
if (entree_inter == HIGH)
{
encoche[1]= true;
} 
else
{
  encoche[1]= false;
}
delay (1000);
Serial.println ("mouvement table");
gestionencoche();
    Serial.println("encoche 1=");
    Serial.println(encoche[1]);
    Serial.println("encoche 2=");
    Serial.println(encoche[2]);
    Serial.println("encoche 3=");
    Serial.println(encoche[3]);
    Serial.println("encoche 4=");
    Serial.println(encoche[4]);
    Serial.println("encoche 5=");
    Serial.println(encoche[5]);
delay (2000);
Serial.println ("arret table");







}

ça marche...en partie

l'encoche 5 fait n'importe quoi, un coup 3 , un coup 6, alors que devrais avoir 0 ou 1

et l'inter ne fait aucun effet sur l encoche 1, elle devrait la mettre a true ou false

le montage est simple pour l essai, un inter sur l entrée 9 et voila

Il faut que tu lises l'entrée
au lieu de

 if (entree_inter == HIGH)

c'est

 if (digitalRead(entree_inter) == HIGH)

ok bon c est sur....

et pour le encoche [5] qui donne 3 ou 6? tu vois quelques choses?

Je ne vois pas ce que tu veux faire.

je commence par mettre toute les encoche à false

ensuite, j'ai un interrupteur,si il est HIGH

encoche(1) devient true,

si LOW,

encoche(1) devient false

ensuite quand j appel gestionencoche()

on decale tout le tableau d'une ligne, la valeur qui etait dans encoche 1 passe a encoche 2, celle de encoche 2 passe a encoche 3 etc...

Le premier élément ce n'est pas encoche[1], mais encoche[0]
Il y a un problème dans gestionencoche(), ça écrit en dehors du tableau

Plutôt que de tenter de retire un à tous les indices d'un tableau de booleens (8 bits), sacrifiez le premier élement (qui ne sera jamais utilisé, d'où un gigantesque gaspillage), rajoutez un à la dimension du tableau, sur une ligne et laissez tous les autres indices tels qu'ils sont (c'est moins mauvais que d'oublier de corriger, quelque part dans un code -qui peut être touffu quoique fonctionnel- des dizaines d'indices de tableau)

En corrigeant les indices ça donne

#define entree_inter  9


bool encoche[5];
//#define base_pin 5 //pin choisie arbitrairement !

void vidage()
{
  for ( int i = 0; i < 5; i++)
  {
    encoche[i] = false;
  }
}
void gestionencoche()
{

  for ( int i = 4; i > 0; i--)
  {
    encoche[i] = encoche[i-1];
  }

}

/*void dumpencoche()
  {
  for( int i=0; i<5; i++)
  {
     //setmbbit 319+i,encoche(i);
     //ici par contre je ne connais pas l'instruction utilisée mais
     //vu son nom je pense qu'on positionne un bit dans un registre en
     //fonction de la valeur de encoche[i]
     digitalWrite(base_pin+i, encoche[i]);
  }
  }*/

void setup() {
  pinMode (entree_inter, INPUT);
  vidage();
  Serial.begin(115200);
}

void loop ()
{
  gestionencoche();
  if (digitalRead(entree_inter) == HIGH)
  {
    encoche[0] = true;
  }
  else
  {
    encoche[0] = false;
  }
  delay (1000);
  Serial.println ("mouvement table");
  Serial.print("encoche 0=");
  Serial.println(encoche[0]);
  Serial.print("encoche 1=");
  Serial.println(encoche[1]);
  Serial.print("encoche 2=");
  Serial.println(encoche[2]);
  Serial.print("encoche 3=");
  Serial.println(encoche[3]);
  Serial.print("encoche 4=");
  Serial.println(encoche[4]);
  delay (2000);
  Serial.println ("arret table");
}

merci kamill, on va tester nos deux versions