[arduino] Hiking Environmental Data Logger

Hiking Environmental Data Logger [arduino] - Electronique, domotique, DIY

Marsh Posté le 10-01-2016 à 17:49:30    

:hello:
 
J'ouvre un topic qui va me servir à demander à l'aide régulièrement :D
 
Objectif : avoir un arduino avec quelques capteurs utiles en rando (humidité, température, intensité lumineuse, UV, pression atmosphérique) avec le GPS et écrire tout ça sur un fichier dans une carte SD, histoire de balancer ça sur un logiciel de carto style QGIS.
 
Évidemment, je nage complètement, donc le code est un ignoble monstre de Frankenstein avec des bouts de trucs récupérés à droite à gauche, et va devoir évoluer vers un truc fonctionnel :D
 
Toute aide bienvenue :o
 
NB : A partir de "//GPS part" c'est du pompage pur et dur, j'ai juste modifié la fréquence de write sur la SD pour passer à 1 minute au lieu de 1 seconde.  [:sent mal_homme:1]  
 

  • Objectif du moment : définir les pins.


Code :
  1. /*
  2. ~~~~~~~~Hiking Environmental Data Logger~~~~~~~~
  3. Arduino : MEGA 2560
  4. GPS : MT3329 SKM53 (5V)
  5. Light intensity : BH1750 (3.3V)
  6. UV : ML8511 (3.3V)
  7. Barometric pressure : BMP180 (3.3V)
  8. Humidity and Temperature : HTU21D (3.3V)
  9. SD card module : Generic module. Connection : 5v to 5v, CLK to Pin 13 on your Arduino, DO to pin 12, DI to pin 11, and CS to pin 10
  10. */
  11. //Libraries
  12. #include <TinyGPS.h>
  13. #include <NewSoftSerial.h>
  14. #include <Wire.h>
  15. #include <BH1750.h>
  16. #include <plotly_streaming.pre.h> // UV
  17. #include <SFE_BMP180.h>
  18. #include <SparkFunHTU21D.h>
  19. #include <SD.h>
  20. #include <SPI.h>
  21. #define BUFF_MAX 100   // size of GPS & SD buffers
  22. #define BH1750_SDA A0
  23. #define BH1750_SCL A1
  24. #define ML8511_EN A2
  25. #define ML8511_OUT A3
  26. #define BMP180_SDA A4
  27. #define BMP180_SCL A5
  28. #define HTU21D_SDA A6
  29. #define HTU21D_SCL A7
  30. #define SD_CLK 13
  31. #define SD_DO 12
  32. #define SD_DI 11
  33. #define SD_CS 10
  34. // GPS part
  35. /*
  36. RXD Arduino Pin 3
  37. TXD Arduino Pin 2
  38. RST Leave Open ? (Connect to a N/O momentary switch pulled low to reset?)
  39. NC Leave Open
  40. GND Ground
  41. VCC +5
  42. Make sure you download TinyGPS.h
  43. */
  44. unsigned long fix_age;
  45. SoftwareSerial GPS(2,3);
  46. TinyGPS gps;
  47. void gpsdump(TinyGPS &gps);
  48. bool feedgps();
  49. void getGPS();
  50. long lat, lon;
  51. float LAT, LON;
  52. void setup(){
  53. GPS.begin(9600);
  54. Serial.begin(115200);
  55. }
  56. void loop(){
  57. long lat, lon;
  58. unsigned long fix_age, time, date, speed, course;
  59. unsigned long chars;
  60. unsigned short sentences, failed_checksum;
  61. // retrieves +/- lat/long in 100000ths of a degree
  62. getGPS();
  63. gps.get_position(&lat, &lon, &fix_age);
  64. Serial.print("Latitude : " );
  65. Serial.print(LAT/100000,7);
  66. Serial.print(" :: Longitude : " );
  67. Serial.println(LON/100000,7);
  68. }
  69. void getGPS(){
  70. bool newdata = false;
  71. unsigned long start = millis();
  72. // Every 1 minute we print an update
  73. while (millis() - start < 60000)
  74. {
  75.   if (feedgps ()){
  76.    newdata = true;
  77. }
  78. }
  79. if (newdata)
  80. {
  81.   gpsdump(gps);
  82. }
  83. }
  84. bool feedgps(){
  85. while (GPS.available())
  86. {
  87.   if (gps.encode(GPS.read()))
  88.   return true;
  89. }
  90. return 0;
  91. }
  92. void gpsdump(TinyGPS &gps)
  93. {
  94. //byte month, day, hour, minute, second, hundredths;
  95. gps.get_position(&lat, &lon);
  96. LAT = lat;
  97. LON = lon;
  98. {
  99.   feedgps(); // If we don\'t feed the gps during this long routine, we may drop characters and get checksum errors
  100. }
  101. }
  102. //SD Part
  103. GPSlog = SD.open("GPS.log", O_CREAT | O_WRITE);  // open/append to a file GPS.log
  104. void loop()
  105. {
  106. char inBuffer[BUFF_MAX];    // buffer used to read NMEA lines from GPS
  107. byte outBuffer[BUFF_MAX];   // buffer used to write NMEA lines to SD card
  108. int sizeBuffer = 0;        // counter of how many chars per line
  109. GPSlog.write(outBuffer, sizeBuffer);  // write GPS NMEA output to SD
  110. GPSlog.print("\r\n" );   
  111. GPSlog.flush();
  112. }


Message édité par Kyjja le 11-01-2016 à 00:18:29

---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 10-01-2016 à 17:49:30   

Reply

Marsh Posté le 10-01-2016 à 18:57:22    

- C'est quoi ces #include tout vide en ligne 30/31 ? :o
- Pense à faire des .h et splitter ton code dans quelques fichiers. L'indentation aussi ça peut servir :d.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-01-2016 à 23:07:38    

- Une erreur de copier/coller sauvage :o
- .h c'est pas des librairies ? Pour les indentations ça ne passe pas avec les balises code.

 

Edith : Bon, j'ai défini les pins, si mes souvenirs sont bons faut mettre les SDA et SCL des capteurs sur les pins Analog In.


Message édité par Kyjja le 10-01-2016 à 23:41:40

---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 11-01-2016 à 09:12:31    

.h : je veux dire créer le/les tiens, juste pour y déporter les déclarations genre bool feedgps();, void getGPS();
Pour l'instant y aura presque rien dedans mais si tu t'inquiètes de la bordélisation de ton code tu verras rapidement l'intérêt d'avoir découpé ton programme.
Pour les inclure tu mets des guillemets "" au lieu de chevrons <> autour, je te laisse chercher.

 

Pour SDA/SCL ce sont les fils de l'I2C, donc il faut les connecter aux pins qui supportent ce protocole. Sur du Mega2560 ce sont 20 (SDA), 21 (SCL). Sauf si tu fais de l'I2C software (ce qui n'est pas une bonne idée sauf réelle nécessité, c'est déjà assez lent comme ça l'I2C :d)


Message édité par TotalRecall le 11-01-2016 à 09:14:02

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-01-2016 à 13:49:26    

Ouais mais attend, j'ai plusieurs SDA/SCL, je peux tous les balancer sur les pinz 20 et 21 ?  [:kyjja:3]  
 
Pour la lenteur je m'en tamponne un peu a priori, vu que je veux les valeurs toutes les minutes (voir toutes les 2 ou 5 minutes, j'affinerai au besoin :o).


---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 11-01-2016 à 13:59:03    

Ouais, si tes capteurs ont tous une adresse différente tu peux tous les balancer ensemble, c'est le but de l'i2c.
Dans le meilleur des cas y a qu'à relier ensemble les fils identiques.
Il faut parfois aussi mettre des pull up de 10k.
Si ils ont la même adresse faut bidouiller un peu plus et utiliser par exemple un multiplexeur i2c (ex : TCA9548A)

 

Certains gros arduino ont plusieurs bus i2c (le due par exemple il me semble, j'ai pas vérifié)


Message édité par TotalRecall le 11-01-2016 à 13:59:27

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-01-2016 à 14:24:39    

Et comment puis-je connaitre l'adresse ? Parce que si c'est le boxon, autant utiliser les ports analog puisque j'en ai pléthore [:tinostar]
 
(bon je vais quand même commander un ou deux moultiplexeur en shenzennie, si t'as des ref qui sont mieux que ce TCA9548A, laisse savoir frère).


---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 11-01-2016 à 14:38:25    

Ca dépend des devices [:spamafote].
Si tu utilises une lib commune à plusieurs marques, tu peux avoir à fourguer l'info explicitement lors de ton setup ou tous déclarations (une adresse hexa genre 0x34 par exemple), ou si c'est une lib spécifique là c'est sans doute à l'intérieur de son code que se trouve l'info et là le constructeur doit par ailleurs la communiquer s'il est sympa.
 
Pas de suggestion pour les refs, mais on doit trouver des tas de pages d'infos là dessus, l'i2c c'est très courant...


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-01-2016 à 15:00:32    

Mes capteurs viennent de chez Aliexpress, donc pour les renseignements, on repassera :D
 
Du coup c'est sans doutes plus simples de les laisser sur des pins analogues, vu que j'en manque pas (il m'en faut 8 sur les 15 que comprend le MEGA 2560) :spamafote:
 
Ok, c'est loin d'être élégant, mais c'est moins contraignant.


---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 11-01-2016 à 15:07:18    

Bah tant que t'as des pins dispo et si tu sais les driver c'est pas si mal, aucun souci c'est comme tu veux [:spamafote].
Mais ça pourrait te compliquer la vie de ne pas les connecter tout bêtement au port fait pour ça.
 
Pour l'instant j'ai l'impression qu'à part les déclarer tu ne fais absolument rien de tes capteurs ?
Avec les références que tu donnes, les adresses I2C pourraient être 0x23 (BH1750), 0x77 (BMP180), 0x40 (HTU21D). Donc toutes différentes.
 
Généralement c'est quand tu as plusieurs capteurs identiques que le multiplexage s'impose pour ne pas qu'ils se marchent dessus.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-01-2016 à 15:07:18   

Reply

Marsh Posté le 11-01-2016 à 16:23:09    

Ouais ouais pour l'instant ils ne font rien, vu que j'y connais rien j'y vais étape par étape :o
 
Sur mon précédent bricolage, je n'avais qu'un capteur (BMP180) du coup il était branché sur des Analog d'un Arduino Pro Mini.
 
Bon du coup je vais voir pour un multiplexeur, ça permettra peut-être d'utiliser un Arduino R3 si ça suit au niveau de la quantité de mémoire. Problème : c'est pas donné : le TCA9548A est vendu près de 7 euros, soit quasiment le prix d'un clone Arduino MEGA 2560, et plus cher que n'importe quel capteur utilisé ici (voir plus que la totalité des capteurs d'ailleurs).  [:obsydiankenobi:4]  
 
Du coup j'ai un peu fouillé et trouvé ça (enfin un clone à 1.12 euro) => https://www.sparkfun.com/products/9056
 
Ça te semble ok ?  [:kyjja:3]


---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Marsh Posté le 11-01-2016 à 17:03:12    

Les 74xx4067 c'est des multiplexeurs 16 canaux normaux, rien à voir avec un mux orienté protocole. Donc non.
 
Mais je t'ai dit plus qu'apparemment dans ton cas y a a priori pas besoin du tout de mux vu que tes capteurs ont chacun leur adresse.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 14-03-2016 à 18:15:32    

Deux mois plus tard ( [tinostar] ) il fait beau et je me souviens que j'ai ce truc qui traine.
 
Du coup je peux brancher l'intégralité de mes SDA sur A4 et de la même manière tous mes SCL sur A5 si je comprend bien (ou 20 et 21 si faut prendre un MEGA).
 
C'est vachement intéressant en utilisant une veroboard dont on ferait partir les 4 fils nécessaires pour l'ensemble des capteurs, à savoir 3.3V, GND, SCL et SDA. Et surtout ça permet d'en empiler une infinité tant qu'ils sont tous différents (ce qui est le cas dans le bricolage en question).
 
J'ai bon ? :o


---------------
HWBot | Conso GPU | Who's who PSU | Mes BD \o/ | GReads | MSpaint
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed