Construction libre de droit d'un Thermovarroa

Appareil destiné a la protection des abeilles par hyperthermie

a marqué ce sujet comme résolu.

mon but n'est pas de polémiquer, mais d'après lextronic Seeed semble bien être un fabricant.
L'intérêt de cette info est surtout dans le fait que si quelqu’un possède des connecteurs Molex (récupéré par exemple sur un ancien ordinateur), il semble peut probable de pouvoir les utiliser avec des modules Grove.

+0 -0

mon but n'est pas de polémiquer, mais d'après lextronic Seeed semble bien être un fabricant.

Admettons… Perso je vais sur le site de Seed et je vois ca dans leur page principale

Seeed is a hardware innovation platform for makers to grow inspirations into differentiating products. By working closely with technology providers of all scale, Seeed provides accessible technologies with quality, speed and supply chain knowledge. When prototypes are ready to iterate, Seeed helps productize 1 to 1,000 pcs using in-house engineering, supply chain management and agile manufacture forces.

Ce qui me laisse penser que ce sont des intermédiaires de vente et éventuellement des producteurs de prototypes si tu as un besoin précis.

Mais tout ca au final n'a pas d'importance.

L'intérêt de cette info est surtout dans le fait que si quelqu’un possède des connecteurs Molex (récupéré par exemple sur un ancien ordinateur), il semble peut probable de pouvoir les utiliser avec des modules Grove.

Parce que Molex ne fait pas que des connecteurs PC. C'est un peu comme dire "J'ai un camion semi-remorque Renault en panne dans mon jardin, je vais en prendre le moteur pour remplacer celui de ma megane". Effectivement ca va pas marcher. Renault produit une gamme large de véhicule, Molex produit une gamme large de connecteur.

+0 -0

"J'ai un camion semi-remorque Renault en panne dans mon jardin, je vais en prendre le moteur pour remplacer celui de ma megane". Source:Eskimon

ça sent le mec qui a essayé de mettre un moteur de clio dans sa megane ou le contraire et qui a réussi. normal, chez renault, ils font un bloc moteur, il sert pour toute la gamme, pas cons hein? sauf qu'ils changent les fixations tous les 2 mois pour être sur que si quelqu'un veut changer son moteur, rien ne fonctionnera. (oui j'ai une megane qui a pété un joint de culasse, et ça fait 3 fois que je change de moteur, 3 fois qu'il est différent alors qu'il a le même numéro de série)

pour le reste, grove ou pas, Seeed ou pas, c'est pas ça qui est important, c'est qu'il comprenne ce qu'il fait pour être sur de ce qu'il fait: il est en train de remplacer une plaque à trous par… une plaque de connecteurs. je sais pas si c'est bien intéressant (pour moi, ça l'est pas du tout, 2€ la prise-bornier à vis, 8€ la plaque à prises… c'est un peu comme du vol pour moi) mais si ça a un quelconque intérêt pour l'OP, ma foi… the show must go on :P

+0 -0

Pour mettre tout le monde d'accord :

  • Seeed Studio est un organisme dans le style de Sparkfun ou de Adafruit : ils fabriquent des modules qu'ils revendent. Mais tout comme ces deux sites, ils font aussi simple revendeur de matériel électronique et électrique.

  • Arrêtez de parler de connecteur "Molex" quand c'est un connecteur fabriqué par Molex. Ils n'ont pas fait 3 connecteurs en 50 ans… Molex est une société de connectique, comme TE Connectivity, Samtec, Phoenix Contacts ou Hirose. On appelle pas cependant chaque connecteur d'une marque "connecteur marque". Certains types de connecteurs ont un nom générique (genre SMA, BNC, etc. valable dans la RF en général) mais si possible dites connecteur "de chez" marque, avec le nom de la gamme, c'est encore mieux :p

(En l'occurrence, le connecteur "Grove" est différent du connecteur "Molex" de PC ;) )

+0 -0

Le projet avance bien

J'ai reçu le matériel nécessaire y comprit 2 sondes DS18B20
Cela fonctionne correctement, mais je souhaiterai savoir si il est possible de simplifier le code.

En effet, je définie les 2 sondes ainsi

1
2
3
4
5
6
//cellule D2 DS18B20 
int DS18S20_D2 = 2;
OneWire dse(DS18S20_D2);
//cellule D3 DS18B20 
int DS18S20_D3 = 3;
OneWire dsc(DS18S20_D3);

ensuite dans void loop()

1
2
float temperatureE = getTempE();
float temperatureC = getTempC();

puis 2 fonctions,
mes deux fonctions sont identiques, sauf les noms des fonctions
- getTempE() et dse => exemple dse.select(addr) …
- getTempC() et dsc => exemple dsc.select(addr) …

ci dessous la fonction getTempE() en exemple

Ma question est :
Est il possible de faire une seule fonction ?
si oui, pouvez vous me guider ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
float getTempE(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !dse.search(addr)) {
      //no more sensors on chain, reset search
      dse.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  dse.reset();
  dse.select(addr);
  dse.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = dse.reset();
  dse.select(addr);    
  dse.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = dse.read();
  }

  dse.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

Pour info,
Le code complet concernant cette opération

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <Wire.h>
#include "OneWire.h"
#include "rgb_lcd.h"

//cellule D2 DS18B20 
int DS18S20_D2 = 2;
OneWire dse(DS18S20_D2);
//cellule D3 DS18B20 
int DS18S20_D3 = 3;
OneWire dsc(DS18S20_D3);
//ecran lcd rgb
rgb_lcd lcd;

//------------------------------------------------------
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);

}

//------------------------------------------------------
void loop() {

float temperatureE = getTempE();
float temperatureC = getTempC();

if (isnan(temperatureE) || isnan(temperatureC)) {
  lcd.println("pas d infos");
} else {

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("TE:");
  lcd.print(temperatureE);

  lcd.setCursor(0, 1);
  lcd.print("TC:");
  lcd.print(temperatureC);

  delay(5000);

}
}
float getTempE(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !dse.search(addr)) {
      //no more sensors on chain, reset search
      dse.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  dse.reset();
  dse.select(addr);
  dse.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = dse.reset();
  dse.select(addr);    
  dse.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = dse.read();
  }

  dse.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}

float getTempC(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !dsc.search(addr)) {
      //no more sensors on chain, reset search
      dsc.reset_search();
      return -1000;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }

  dsc.reset();
  dsc.select(addr);
  dsc.write(0x44,1); // start conversion, with parasite power on at the end

  byte present = dsc.reset();
  dsc.select(addr);    
  dsc.write(0xBE); // Read Scratchpad


  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = dsc.read();
  }

  dsc.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;

}
+0 -0

si j'osais, à ta place, comme les deux capteurs sont identiques, je ferais même un objet commun, dont le constructeur reprend la broche sur l'arduino, et j'en ferais une instance par capteur, soit 2 dans ton cas.

ça donnerait des choses comme:

1
2
3
4
DS1 = new DS18S20(2);
DS2 = new DS18S20(3);
DS1.getTemperature();
DS2.getTemperature();

tout en n'ayant codé getTemperature qu'une seule fois, et sans s'embêter avec des adresses de capteur, qui peuvent changer en cours de projet, et donc potentiellement nécessiter des grosses maj de code si y'a un getTemperature toutes les 3 lignes à corriger (et tout ça, sans se tromper).

autre chose, dans ton tout premier bloc de code, au lieu de déclarer tes capteurs avec des int, déclare-les avec un #define, ça écrira en vert, c'est plus joli. non en fait la vraie raison n'est pas seulement esthétique: c'est des constantes que tu déclares, donc il vaut mieux les déclarer de cette manière, c'est plus propre, pour 2 raisons:

  • c'est le compilateur qui fera l'affectation de valeur, pas l'arduino, donc un gain de quelques microsecondes au moment des appels de fonctions.ça c'est la raison pas vraiment intéressante pour toi
  • mais surtout ça évite les erreurs par la suite, vu que c'est des constantes qui ne peuvent pas bouger pendant l'exécution du code ça c'est la raison intéressante pour toi
+0 -0

Merci a vous deux pour vos réponses

Remace, ta proposition concernant DS1/DS2 me semble bien intéressante. Hélas mes compétences ne me permettent pas pour le moment de mettre en place ces éléments. Cela m'intéresse d'autant plus que j'ai aussi a déclarer 3 autres sondes identiques. Pourrais tu être un peu plus explicite par rapport au 3 points que j'ai énoncé dans le début de mon message précédent. A savoir
- la définition des sondes (cellule, type, onwire …)
- le void loop() => que mettre a la place de float temperatureE = getTempE();
- la fonction son nom et que mettre par exemple a la place de dse.reset();

Pour ce qui est de la déclaration des capteurs par #define => la j'ai bien compris et mise en place la proposition sur l'ensemble du code

+0 -0

malheureusement, c'est le genre de trucs que je saurais pas expliquer proprement.

y'a un tuto ici(clique c'est un lien) mais il est peut-être pas suffisamment complet pour ton cas.

en fait, une lib, en C++, c'est une classe: la description d'un objet, et de tout ce qu'il peut faire, à part. et ensuite, il suffit dans le code de créer cet objet pour avoir accès à toutes ses fonctionnalités (que tu as codées)

mettons que tu aie un avion, tu peux lui donner 2-3 variables (son immatriculation, l'agence de voyage, le nombre maxi de passagers, son état général, en pourcentage par exemple, etc…) et tu peux aussi lui donner des fonctions: faire la révision, voler vers un certain nombre de villes. cette étape, c'est grâce à elle que tu fais le fichier .h (le header, là où tu déclare tout, dès que ça te vient par la tête, en réfléchissant à qui dans ton programme a le droit d'accéder à telle ou telle variable et fonction: le mécanicien n'a pas accès à l'immatriculation de l'avion, il n'a pas le droit de la modifier. par contre, il peut faire la révision, et donc il a accès à la fonction réparer l'avion).

et ensuite y'a plus qu'à coder les fonctions, et là c'est bête et méchant: tu prends une fonction, tu code. tu en prends une autre, et tu code. et ainsi de suite.

dans ton cas, j'aurais tendance à faire un objet de ce style là: - fichier .h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include "OneWire.h"
#include "WProgram.h"

#ifndef DS18S20_h
#define DS18S20_h

class DS18S20{
public:
    DS18S20(int pin);
    float getTemperature();//mesurer la température, et la retourner sous la forme d'un float

private:
    int _pin;//cette variable est en private, parce que personne ne doit pouvoir la modifier
        OneWire _bus;
};

#endif

je te laisse faire le .cpp (c'est grossomodo ce que tu as déjà fait avant, y'a plus qu'à remettre en forme…) et dans le sketch arduino, ce serait plutôt de ce style:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <Wire.h>
#include "DS18S20.h"
#include "rgb_lcd.h"

//cellule D2 DS18B20 
#define DS18S20_D2 2
DS18S20 capteur_1(DS18S20_D2);

//cellule D3 DS18B20 
#define DS18S20_D3 3
DS18S20 capteur_2(DS18S20_D3);

//=========================================
void setup(){
    lcd.begin(16, 2);
}



//=========================================
void loop(){
    float temperatureE = capteur_1.getTemperature();
    float temperatureC = clateur_2.getTemperature();

    if (isnan(temperatureE) || isnan(temperatureC)) {
        lcd.println("pas d infos");
    } else {

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("TE:");
        lcd.print(temperatureE);

        lcd.setCursor(0, 1);
        lcd.print("TC:");
        lcd.print(temperatureC);

  delay(5000);

}
}

voilà ce que j'aurais fait. pas sûr que ça compile dans l'état actuel du code, j'ai pas essayé, et vu que j'ai pas fait le .cpp, de toute façon ça ne marcherait pas. à toi de poser des questions sur ce que t'as pas compris, parce que la programmation orientée objet, c'est quelque chose qui mériterait presque un tuto à elle seule, et quel que soit le langage, et perso j'ai pas trop les capacités d'en faire un…

pour VRAIMENT plus de précisions, tu peux chercher un tuto de C++ qui parle de programmation orientée objet, style celui sur openclassrooms, chapitre 2 (clique c'est un lien).

enfin voilà… j'espere ne pas t'avoir trop embrouillé. si tu vois que t'y arrive pas mieux comme ça, repasse sur la solution d'Eskimon, qui est plus simple, mais qui produit un code un peu moins lisible (enfin ça, c'est une question de gouts et d'habitude plutôt qu'autre chose…)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte