Lecture de bits, tableau et chaine de caractère

Bonjour tout le monde ! J'ai 2 questions que vous trouverez sans doute simple, mais j'ai besoin de votre aide :

  • Imaginons que les entrée/sorties numeriques 22,23,24,25 de ma carte soient branchés sur un bus de données (avec 22 lsb,25msb) qui est la sortie de mon montage, et donc des INPUT digitales sur ma carte. J'aimerais creer une fonction qui permettrait de lire les états des broches 22,23,24,25 et ensuite d'assigner ces valeurs sur un octet appelé par exemple BusSortie, où le lsb aurait comme valeur la broche 22, le lsb+1 la broche 23 etc.. J'ai fait cette fonction mais elle ne marche pas :
void test() 
{
    for (int i=0; i<4; i++)
    {
     digitalRead(22+i);
     bitRead(BusSortie,i)=digitalRead(22+i);
    }
  • Deuxième problème, j'aimerais savoir comment stocker plusieurs chaines de 20 caractères dans un tableau , et de pouvoir ensuite envoyer une de ces chaines dans un autre tableau à 2 dimensions qui contient des long int sur l'une de ses lignes. J'ai essayé ceci :
const char *chaine[20]={"A7000000001111111111,A7000000010000000000"}; // tableau contenant les 20 chaines de 20 caractères (j'ai effacé les 18 autres pour une meilleure lisibilité)
long int nb[150][2]; // tableau contenant des long int


void setup(){
for (int i=0; i<150; i++)
{
  nb[i][0]=0xFFAB; // je remplis une ligne par un nombre
}
nb[0][1]=*chaine[0] // ici, est ce que le contenu de la premiere case de mon tableau de chaine de caractère est stocké dans la premiere ligne/deuxieme colonne de mon tableau de nombre ?
}

bonjour,
pourquoi ne pas commencer directement le
int i=22; i<26;i++

Bonjour,

1ere question

void test() 
{
    int busSortie=0;
    for (int i=25; i>=22; i--)
    {
      busSortie<<1;               // décale a gauche pour mettre le prochain bit
      busSortie|=digitalRead(i);  // range le bit dans le lsb
    }
}

2eme question: je n'ai pas vraiment compris

Merci beaucoup pour vos réponses !
En gros pour le 2e probleme : j'aimerais faire passer une chaine de 20 caractères initialement présente dans un tableau de chaine de caractère vers un tableau de long int, est ce possible ?

1/

byte BusSortie=0;

void setup() {
  Serial.begin(115200);  
for (int i=0; i<12; i++)
     {
      pinMode(22+i, INPUT);
     }
}

void loop()
{

    for (int i=0; i<4; i++)
    {
     int entree=digitalRead(2+i);
     if ( entree == 1){bitWrite(BusSortie,i,0);}
     if ( entree == 0){bitWrite(BusSortie,i,1);}
     Serial.print("BusSortie =  ");Serial.println(BusSortie);
    }
delay(5000);
BusSortie=0;
}

Merci pour ta reponse ! J'ai deux questions :

Pourquoi mettre le bit sur BusSortie à 0 et non pas a 1 quand on lit 1 ?
Pourquoi remettre la variable a 0 a la fin du programme ?

1 pour 0 ou 0 pour 1, peut importe, c'est le principe que je voulais te montrer.
remise de la variable à 0: vieille habitude, nettoyage du chantier avant de le quitter.

D'accord merci !
Pour le deuxieme probleme j'ai pensé a une idée un peu plus simple pour ce que je souhaiterais faire :
J'aimerais stocker dans un tableau 2 dimensions (qui contient initialement des nombres a 8 bits sur sa premiere ligne) sur la 2eme ligne des adresses qui mènent a des chaines de caractère qui sont stockés dans un autre tableau. ( comme ca j'aurais dans une colonne mon nombre 8 bit avec en dessous une chaine de caractère).

Est ce possible ?

Les tableaux ne sont pas prévus pour gérer des variables de types hétérogènes, les structures sont faites pour ça. On peut faire des tableaux de structures.

Ah d'accord ! Et donc du coup est ce que je pourrais par exemple avec une fonction sprintf relier mes chaines de caractère a un vecteur, stocker ces vecteurs et les mettre dans mon tableau contenant les nombres ? puis ensuite lorsque je voudrais afficher ma chaine de caractère je passerais par une conversion via mon vecteur ? est ce possible ?

:o
Tu pourrais essayé d'être plus clair? Parce que là j'ai pas tout compris.

Oui biensur je vais essayer . Pour commencer j'aimerais savoir si ce programme fait ce que je desire, c'est a dire stocker chacune de mes chaines de caractères à une adresse dans le pointeur appelé "adr", avec dans adr[0] l'adresse contenant *chaineChar[0], adr[1] l'adresse contenant *chaineChar[1] etc..

const char *chaineChar[10]={"000000001111111100","000000001111111101","000000001111111110","000000011111111100","001000001101111111","000001101111111100","011000001111111100","000001111111111100","111100001111111100","000000001110001100"};

char *adr[10];

int sprintf(char *adr, const char *chaineChar);