Attiny85 - probleme lecture analogique

Bonjour ici!

Alors voila, j'ai un problème de lecture analogique avec la broche PB4 - A2 de l'attiny85.

J'essai d'avoir le retour d'une valeur analogique sur des "détecteurs de fuites" (simples plaques cuivrée avec deux électrodes)

Ma broche est placée en INPUT_PULLUP et j'ai bien 5V présent dessus.
j'ai dans le programme l'analogReference(INTERNAL) même résultat avec (DEFAULT) (je n'ai pas besoin d'une grande précision..)

j'ai réaliser un programme de test qui fonctionne correctement sur arduino nano.

Seulement, des que je charge ce programme sur mon attiny, ben ça ne marche pas.

En gros, les retours Serial du nano m'ont permis de voir le comportement en lecture du capteur,
Si je le cour circuite (en posant mon doigt dessus par exemple) , je vois bien la valeur changée.

Par contre, lorsque je met le morceau de programme voulu dans le tiny, On dirait que cela ne marche pas comme prévu. en gros, le tiny démarre en mode "seuil bas en lecture" puis la valeur doit probablement montée pour ensuite ne plus redescendre lorsque je court circuite le capteur.

J'ai déjà trouver une particularité de la broche PB4, et il faut la lire apres l'avoir declarer en A2 sinon (4) apparemment ça ne marche pas.

J'imagine que je dois passé à coté d'un truc, mais sans le retour Serial sur tiny, je ne vois pas trop quoi..

Je pense bien au CAN mais dans le fond, je comprend pas vraiment ce qui ce passe, ni ce que je pourrais envisager d'essayer.

Et bien sur, j'ai bloquer cette entrée a cette fonction, et fait ça sur platine définitive.. (heee ouai, sinon c'est pas marrant!!)

Quelque chose me dis que c'est un truc tout bête.. mais a force de creuser, je me perd dans mon trou...

le code test ci joint: (sur le nano, j'arrive au cour circuit a avoir des valeurs a 0. sur l'attiny, une fois que ma ledO s'allume apres premiere moyenne, la ledVeille ne ce rallume jamais => je ne peut donc pas tester si j'ai des fuites.)

byte ledO = 0 ; // attribution de la broche 0 pour la led mise en marche  (bleu)
byte ledVeille = 1 ; // attribution de la broche 1 pour la led de veille (jaune)

unsigned int detecteurFuite = (A2); // broche A2 analogique attiny qui est la broche PB4

int priseDeMesure=0;


void setup() {
  // put your setup code here, to run once:

   //Serial.begin(9600);
   //Serial.println("***debut_de_programme***");


   pinMode(detecteurFuite, INPUT_PULLUP); //lecture signal  de 1023 à 0

   pinMode(ledO, OUTPUT);
   pinMode(ledVeille, OUTPUT);


   digitalWrite(ledVeille,LOW); 
   digitalWrite(ledO,LOW);
   analogReference(INTERNAL);

}

void loop() {
  // put your main code here, to run repeatedly:

 /* moyenne = analogRead(detecteurFuite); //rempli le tableau
   Serial.print("priseDeMesure=");
   Serial.println(moyenne);
 delay(1000);*/
  surveyFuites();

}

void surveyFuites(){ // fonction detection / surveillance de fuites eventuelles

 #define NUMSAMPLE 20 //20 prises de valeurs
 
 unsigned int lectureCapteurFuite[NUMSAMPLE]; // declaration d'un tableau de valeur NUMSAMPLE en variable de type "int"!!
 
 static unsigned int moyenne;
 
 static unsigned long currentTimeFuite = millis();

 if(millis() - currentTimeFuite >= 50 && priseDeMesure < NUMSAMPLE ) { //50 millisecondes

     currentTimeFuite = millis();
     lectureCapteurFuite[priseDeMesure] = analogRead(detecteurFuite); //rempli le tableau
     //Serial.print("priseDeMesure=");
     //Serial.println(lectureCapteurFuite[priseDeMesure]);
     priseDeMesure++;

     
     
   }

   if(priseDeMesure >= NUMSAMPLE){

      for(int i=0; i<NUMSAMPLE ; i++){

        moyenne += lectureCapteurFuite[i];
        
        
      }
        moyenne /= NUMSAMPLE;
        priseDeMesure = 0;
       // Serial.print("valeur_moyenne=");
       // Serial.println(moyenne);
       // delay(100);
        
   }


      
 switch(moyenne){

  case 0 ... 10 : 

   digitalWrite(ledVeille,HIGH);
   delay(100);
   digitalWrite(ledVeille,LOW);
   delay(100);
   digitalWrite(ledVeille,HIGH);
   delay(100);
   digitalWrite(ledVeille,LOW);
   delay(500);
   break;

   case 11 ... 1023 :

   digitalWrite(ledO,HIGH);
   delay(100);
   digitalWrite(ledO,LOW);
   delay(100);
   digitalWrite(ledO,HIGH);
   delay(100);
   digitalWrite(ledO,LOW);
   delay(500);
   break;

   default:
   digitalWrite(ledO,HIGH);
   digitalWrite(ledVeille,LOW);
   delay(100);
   digitalWrite(ledO,LOW);
   digitalWrite(ledVeille,HIGH);
   delay(100);
   digitalWrite(ledO,HIGH);
   digitalWrite(ledVeille,LOW);
   delay(100);
   digitalWrite(ledO,LOW);
   digitalWrite(ledVeille,HIGH);
   delay(500);
   digitalWrite(ledVeille,LOW);
  
 }
    
      
     
}

Merci d'avance pour l'éclairage de ma lanterne!! (commence a faire tout noir dans c'trou ^^)

Bonjour,

Si tu veux utiliser des fonctions faites pour les pins digitales, il faut utiliser le numéro de pin digitale, donc faire:
pinMode(4, INPUT_PULLUP);

Remarque: si tu utilises l'attinycore de Spence Konde, tu peux utiliser Serial (qui est en fait un SoftwareSerial). Il te faut une interface usb-série.

Finalement, c'était vraiment tout bête, dans un premier temps, il fallait remettre la variable moyenne à 0 lors du nouveau calcul... (grossière erreur de ma part) et dans un deuxième temps, mes capteurs (plaques anode + cathode) étaient oxydées.

Sur le nano c'était apparemment pas gênant, mais sur le tiny ça le faisait pas. Je ne m'en suis rendu compte qu'en faisant directement court circuit avec les fils.

voici le bout de code corrigé:

@ Kamill oups desolé, c'est le commentaire que j'ai laissé. Je corrige ça, j'avais commencer en espérant que le digital suffirait... Mais je n'obtenais pas les résultats voulu (trop aleatoire). C'est asse déroutant d'ailleurs que la déclaration de broche "4" ou "PB4" ne fonctionne pas pour l'analogique sur le tiny!!J'ai bien galérer a trouver ça aussi...
J'ai était obligé de mettre (A2).

Ton interface m'intéresse, je suppose que tu parles TX/RX? non?
On pourrait faire un truc du genre en passant par un Nano par exemple?

Pour l'attinycore de Spence Konde? C'est le même genre de fichier a installer que le fichier de David A.Mellis?

en tous cas, merci pour les infos.

Oui, je parle de TX/RX. Je suppose qu'on doit pouvoir utiliser une nano comme interface usb-série, je n'ai jamais essayé.

Je trouve que l'attinycore de Spence Konde est supérieur à celui de David A.Mellis.
Tu peux le trouver ici: GitHub - SpenceKonde/ATTinyCore: Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8
Il y a la procédure d'installation avec le .json qui va bien.

Re Kamill,

J'ai installer et télécharger le attinyCore mais alors là, je sais même plus quoi choisir tellement il y a du choix.. ( PLL par exemple ça veut dire quoi pour le 16Mhz??)

pour le type de puce, je met quoi? optiboot?NoBootLoader? microNucleus?

Je vois aussi qu'on peut desactiver millis() et micro() ainsi qu'intervenir en direct sur le BOD le timer1 et LTO (kezako LTO?)

Oui c'est clair il y a plus de choix!

Pour le NANO, je me rappel avoir transformer en TTL avec un programme vide pour charger les programme ecran Nextion, je suppose qu'on doit faire un truc du même genre, par contre je ne vois pas de TX/RX sur le tiny!! suffirait il de dedier un broche de sortie? (deja rien que transmettre serai bien ^^)

Tu me parler de Serial, je n'ai pas encore eu le temps d'essayer mais, veut tu dire que je n'ai pas besoin d'ajouter de "#include"? et que le traitement est direct?

Aurais tu un lien a me filer comme "mode d'emploi (simplifier, si possible) :rofl:"?

Je vais creuser tous ça...

Merci à toi.

+1
je suis passé à ce portage qui resolvait pas mal problème de timer et sur lequel le portage Mellis "cafouillait"

Ca veut dire que tu peux faire fonctionner l'attiny à 16MHz avec l'oscillateur interne.

Personellement je n'ai jamais utilisé l'attiny85 avec un bootloader. Je mets toujours nobootloader.
Pour une application particulière j'avais essayé de connecter un attiny85 à l'usb avec micronucleus, je n'ai pas réussi à le faire fonctionner. Je ne sais pas si le problème est hard ou soft. Pour l'instant je l'ai laissé de coté, je le reprendrai ... un jour

Link Time Optimization

Oui, pas besoin d'include. Serial fait partie du core (c'est une émulation soft car l'attiny85 n'a pas de liaion série).

Bonjour Messieurs.

Alors, j'ai donc essayer les deux core pour la com serie, ce qu'il en ressort:

pour le core David.A.Mellis, c'est super facile, j'ai trouver ce lien:

en gros, dans le programme on fait:

#include <SoftwareSerial.h>;

SoftwareSerial Serial(numero_broche_Rx, numero_broche_Tx ); //avantage, on choisi ses numéros de broches. Si on n'a pas besoin de RX il suffit de mettre un numéro de broche qui n'existe pas physiquement sur la puce.

/*un:*/ Serial.begin(9600); // dans le setup

Cote matériel: Charger un programme vide dans un nano ou uno et connecter la broche TX du ATTINY sur la broche TX du nano ou uno.

penser a graver la séquence d'initialisation (après sélection de la fréquence voulu sur le µc)

charger le programme dans l'attiny. Débrancher le programmeur ISP, faire le câblage souhaiter sur l'attiny, relie les 2 broches TX et brancher le nano sur l'usb, PENSER A CONNECTER LES MASSES ATTINY et ARDUINO ensemble, et enfin, ouvrir le moniteur série (sélection baud et port COM bien sur).

Pour le attinyCore de SpenceKonde: C'est pareil coté matériel, pas besoin d'inclure la librairie SoftwareSerial! mais par contre les broches Tx et Rx sont fixées!! " TX est AIN0, RX est AIN1"

il est dis dans le descriptif github que l'on peut changer les numeros de broches, ce dont je ne doute pas, mais quand je fais: "#include <SoftwareSerial.h>; SoftwareSerial Serial(numero_broche_Rx, numero_broche_Tx ); " dans le programme, j'ai droit à ce petit message erreur à la compilation:

exit status 1
conflicting declaration 'SoftwareSerial Serial' - (je ne sais pas comment sont déclarées AIN0 et AIN1)

Si quelqu'un pouvait me dire ce qui ne va pas, ou du moins, quel syntaxe adopter pour effectuer le changement de broches...

Merci d'avance et au plaisir.

Ou est ce que tu as lu ça?
Dans le readme il est dit que Serial utilise les pins du comparateur analogique, ce qui semblerait indiquer les pins sont fixées.

Si les pins ne te conviennent pas, tu as toujours la possibilité d'utiliser SoftwareSerial (je n'ai jamais essayer).

Bonjour Kamill, je l'ai interpréter comme ça plutôt ^^.

(quoi, que...: Ce noyau est également entièrement compatible avec la bibliothèque SoftwareSerial habituelle si vous souhaitez un port série logiciel sur une broche différente - cependant, vous ne pouvez toujours transmettre ou recevoir que sur une seule instance série logicielle à la fois - sur des pièces sans série matérielle, cela inclut l'implémentation "Série" du logiciel intégré mentionné ci-dessus. )

Le fait est que lorsque je met "#include <softwareSerial.h> ;

la déclaration des pins voulues: "SoftwareSerial Serial(numero_broche_Rx, numero_broche_Tx ); " génère un conflit.

Ce n'est pas dramatique en soi, mais je ne refuse jamais la possibilité de rajouter une flèche dans mon carquois :upside_down_face:

Surtout que je suis sur que c'est tout bête.

Ça dit que tu peux utiliser la bibliothèque SoftwareSerial.
Si tu utilises SoftwareSerial, il ne faut pas donner le nom Serial à l'instance.
Il faut lui donner un nom qui n'est pas déjà utilisé. Par exemple:
SoftwareSerial ser(0,1);

A punaise!! ok, alors là pour être bête...c'est!! arffff!!!

ok, je note!

un autre petit truc... lors des communications, j'ai par moment, les bon termes qui sortent sur le moniteur et sinon, j'ai beaucoup de symboles à la place..

en gros, lorsque que je fais dans le programme:

Serial.print("moyenne=");
Serial.println(moyenne);

il me met : [+???? (avec les points d'interrogations dans l'autre sens)(valeur de la variable) à la place de: moyenne = 1023 (par exemple).

Cela est du à quoi?

Je pense qu'il y a de temps en temps des problèmes de désynchronisation de la liaison série.
A mon avis c'est du fait que l'oscillateur interne n'est pas pile poil à 8Mhz et peut être que le diviseur ne tombe pas pile sur la fréquence qui va bien pour le baudrate sélectionné.
Essaies un baudrate plus faible (ou plus élevée).

Ok kamill!

Je vais regarder de ce côté.
Merci pour le coup de patte en tous cas!