montage avec DIP SWITCHES = help !

Portrait de chastain

bonjour à tous ....

là je sèche.

j'ai conçu ce petit module que je nomme le sélecteur de modes ou de programmes....img_2189.jpgd

vous observez qu'il comprend une pro mini. Son programme doit permettre de donner une valeur de 0 à 255 à la sortie 3  PWM en fonction de la position des switchs. cette sortie disponible via adaptateur grove ou barrette HC sera reliée à une entrée analogique A0 d'une arduino UNO qui elle gère l'ensemble d'un système. Donc ce module à dip switchs est là pour indiquer au prog de la UNO quel mode ou sous programme il doit mettre en oeuvre pour le système.

Cela ne fonctionne pas avec les 2 codes suivants.....mon circuit est correct je l'ai vérifié plusieurs fois.

code du module à switch:

bool _ABVAR_1_etat_s1= false ;
boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}

bool _ABVAR_2_etat_s2= false ;
bool _ABVAR_3_etat_s3= false ;
bool _ABVAR_4_etat_s4= false ;
int _ABVAR_5_valeur_sortie = 0 ;

void setup()
{
  Serial.begin(9600);
  pinMode( 3 , OUTPUT);
  _ABVAR_1_etat_s1 = __ardublockDigitalRead(9) ;

  _ABVAR_2_etat_s2 = __ardublockDigitalRead(8) ;

  _ABVAR_3_etat_s3 = __ardublockDigitalRead(7) ;

  _ABVAR_4_etat_s4 = __ardublockDigitalRead(6) ;

  _ABVAR_5_valeur_sortie = 0 ;

}

void loop()
{
  Serial.print(_ABVAR_1_etat_s1);
  Serial.print(" ");
  Serial.print(_ABVAR_2_etat_s2);
  Serial.print(" ");
  Serial.print(_ABVAR_3_etat_s3);
  Serial.print(" ");
  Serial.print(_ABVAR_4_etat_s4);
  Serial.print(" ");
  Serial.println();
  Serial.print(_ABVAR_5_valeur_sortie);
  Serial.print(" ");
  Serial.println();
  if (( ( _ABVAR_1_etat_s1 ) == ( HIGH ) ))
  {
    analogWrite(3 , 50);
    _ABVAR_5_valeur_sortie = 50 ;
  }
  if (( ( _ABVAR_2_etat_s2 ) == ( HIGH ) ))
  {
    analogWrite(3 , 100);
    _ABVAR_5_valeur_sortie = 100 ;
  }
  if (( ( _ABVAR_3_etat_s3 ) == ( HIGH ) ))
  {
    analogWrite(3 , 150);
    _ABVAR_5_valeur_sortie = 150 ;
  }
  if (( ( _ABVAR_4_etat_s4 ) == ( HIGH ) ))
  {
    analogWrite(3 , 200);
    _ABVAR_5_valeur_sortie = 200 ;
  }
  delay( 2000 );
}

code la UNO :

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print(analogRead(A0));
  Serial.print(" ");
  Serial.println();
  delay( 2000 );
}

PS : le code de la uno est un test de lecture de la valeur analogique reçue ....lecture dans le moniteur série.

Quand au premier code je n'ai rédigé que 4 tests pour chaque switch actif j'attribue une valeur à PIN3.

J'ai dans l'idée que ce n'est pas la bonne démarche je pense qu'il vaudrait mieux lire la valeur d'un demi octet par exemple me parait plus logique. mais je ne sais pas faire.

merci

trés cordialement

laurent chastain

Portrait de chastain

deuxième photoimg_2190.jpg

Portrait de chastain

Merci brossden pour ces explications des plus claires et détaillées.

Je me suis emballé à fabriquer mon circuit en étant sur de mon coup. 

Une interrogation reste ...comment lire la position des switchs en tant que demi octet ?

faudrait il utiliser l'i2c ?

Cordialement laurent chastain

Portrait de chastain

Bonjour,

merci une nouvelle fois

je vais tester.

Portrait de chastain

mon nouveau module :

img_0765.jpg

pour le programme j'ai fait simple en utilisant la fonction ET

le switch 2 est sur l'entrée 2 et le switch 1 sur l'entrée trois

un aperçu du programme sous ardublock :

vue_ardublock.png

là une copie du code généré par celuici :

bool _ABVAR_1_switch1= false ;
boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}

bool _ABVAR_2_switch2= false ;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  _ABVAR_1_switch1 = __ardublockDigitalRead(2) ;
  _ABVAR_2_switch2 = __ardublockDigitalRead(3) ;
  if (( ( ( _ABVAR_1_switch1 ) == ( LOW ) ) && ( ( _ABVAR_2_switch2 ) == ( LOW ) ) ))
  {
    Serial.print("programme 1 en cours d'execution");
    Serial.print(" ");
    Serial.println();
  }
  if (( ( ( _ABVAR_1_switch1 ) == ( LOW ) ) && ( ( _ABVAR_2_switch2 ) == ( HIGH ) ) ))
  {
    Serial.print("programme 2 en cours d'execution");
    Serial.print(" ");
    Serial.println();
  }
  if (( ( ( _ABVAR_1_switch1 ) == ( HIGH ) ) && ( ( _ABVAR_2_switch2 ) == ( LOW ) ) ))
  {
    Serial.print("programme 3 en cours d'execution");
    Serial.print(" ");
    Serial.println();
  }
  if (( ( ( _ABVAR_1_switch1 ) == ( HIGH ) ) && ( ( _ABVAR_2_switch2 ) == ( HIGH ) ) ))
  {
    Serial.print("programme 4 en cours d'execution");
    Serial.print(" ");
    Serial.println();
  }
  delay( 1000 );
}

En jouant sur les switchs j'obtiens ça.....et ça me convient !!!

vue_moniteur.png

Portrait de chastain

Merci pour le suivi....

je teste pour en faire un programme en version ardublock, car plus adapté pour le collège. 

Ensuite nouvelle conception de mon module dip switch pour platine grove.

je ferai suivre

à plus tard donc

Portrait de chastain

Ton code est plus clair c'est vrai....mais cela s'explique : au collège au programme nos systemes  au moyen de blocs de scratch,appinventor et...ardublock. Ce dernier compile en fichier ino un programme qui nest pas franchement lisible en tout cas pas tes proches de ce que lon ferait directement sous arduino ide. Mais bon ce nest pas demandé à ce niveau là.

Ce qui m'as conduit ici ? Ma conscience professionnelle qui me pousse à rechercher les bonnes infos pour m'autoformer. Et parce que je suis motivé par le monde des makers. Alors quand tu tombes si un tel site avec le travail exceptionnel fournis par son auteur mais aussi sur quelques personnes comme toi qui n.hésitent  pas à partager leurs compétences (comme je n'hésite pas à le faire de mon côté notamment sur mon site) .....