Bonsoir ! Je cherche à stocker dans une variable ce que donne le Serial.print d'une boucle for mais je n'y arrive pas ![]()
Code :
for( i = 5; i >0; i--) {
Serial.print(addr[i], HEX);
}
Merci d'avance.
Bonsoir ! Je cherche à stocker dans une variable ce que donne le Serial.print d'une boucle for mais je n'y arrive pas ![]()
Code :
for( i = 5; i >0; i--) {
Serial.print(addr[i], HEX);
}
Merci d'avance.
Yep!
int i;
char result[8], result2[8];
char adress[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
void setup()
{
Serial.begin(9600);
}
void loop(){
for( i = 0; i < 8; i++) {
result[i] = adress[i];
result2[6-i] = adress[i];
Serial.print(adress[i], HEX);
}
Serial.println();
Serial.print("PRINT : ");
Serial.print(result);
Serial.print(" - ");
Serial.println(result2);
Serial.println("END");
delay(5000);
}
@+
Zoroastre.
C'est un truc de ce genre que tu cherches ?
var1 = addr[0];
var2 = addr[1];
var3 = addr[2];
var4 = addr[3];
var5 = addr[4];
Merci de vos réponses. Zoroastre, dans mon cas ça ne fonctionne pas.
Jean-François, c'est plutôt un truc du genre :
var = addr[i], HEX ;
Dans ça :
for( i = 5; i >0; i--) {
Serial.print(addr[i], HEX);
var = addr[i], HEX;
}
Car en fait je veux faire une condition avec ce que donne le Serial.print mais je n'arrive pas à récupérer le addr en HEX...
Bonjour,
C'est pas bien clair comme explication ^^ le but final c'est quoi ?
Afficher en hexa une variable sur le port série ?
Ou transformer une chaine de caractères hexa en nombre ?
J'ai pas bien compris ^^""
Si le but c'est de faire une conversion hexa (char*) vers long:
long HexaToDecimal(char* pszHexa)
{
long ret = 0, t = 0, n = 0;
const char *c = pszHexa;
while(*c && (n < 16)) {
if((*c >= '0') && (*c <= '9')) t = (*c - '0');
else if((*c >= 'A') && (*c <= 'F')) t = (*c - 'A' + 10);
else if((*c >= 'a') && (*c <= 'f')) t = (*c - 'a' + 10);
else break;
n++; ret *= 16; ret += t; c++;
if(n >= 8) break;
}
return ret;
}
En fait mon code entier lit des DS1992 et le serial.print de la boucle for affiche le numéro de série du DS1992 et moi je voudrais récupérer ce que dit le Serial.print pour faire une condition et vérifier si c'est le bon numéro de série.
ayme.32:
En fait mon code entier lit des DS1992 et le serial.print de la boucle for affiche le numéro de série du DS1992 et moi je voudrais récupérer ce que dit le Serial.print pour faire une condition et vérifier si c'est le bon numéro de série.
Pourquoi récupérer ce que dit le Serial.print ? Vu que tu lui dit quoi dire ! Il suffit de vérifier directement les valeurs.
void verifieNumeroSerie(char* numeroSerie, char* numeroSerieCorrect){
// pour vérifier ce numéro de série il faut tester chaque char
int charCorrect=0; // ce int contient 0 (soit aucun char correcte) par défaut
for(int i=0; i<9;i++) // on vérifie chaque entré du tableau
if(numeroSerie[i] == numeroSerieCorrect[i]) charCorrect++; // si le char est bon on incrémente charCorrect
if(charCorrect==9) // si tout les char sont bon
return true // on retourne true
esle
return false; // sinon on retourne false
}
void loop(){
char numeroSerie[9]; // ce tableau va contenir le numéro de série recu
/* ... */ // ton code qui récupère le numero de série
// imaginons que numeroSerie contient {'0','1','2','3','4','5','6','7','8'}
char numeroSerieCorrect[9] = {'0','1','2','3','4','5','6','7','8'}; // cette variable contient le numéro de série correct
if(verifieNumeroSerie(numeroSerie,numeroSerieCorrect))
Serial.print("numero de série OK");
else
Serial.print("numero de série FAIL");
}
Est ce que cela t'as aidé ou veux tu faire d'une autre façon ? (ou suis je complétement à la masse ^^ ?)
Le numéro de série contient des lettres ![]()
Sinon voilà le code entier :
#include <OneWire.h>
OneWire ds(11);
byte addr[8];
String var1="";
void setup(void) {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop(void) {
getKeyCode();
if(var1=="bon"){
byte i;
for( i = 5; i >0; i--) {
Serial.print(addr[i], HEX); //c'est là que je veux récupérer ce que dit le Serial.print
}
} else if (var1!="") {
Serial.print(var1);
}
delay(1000);
}
void getKeyCode(){
byte present = 0;
byte data[12];
var1="";
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
if ( addr[0] != 0x08) {
var1="ce n est pas un DS1992";
return;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
var1="CRC invalide";
return;
}
var1="bon";
ds.reset();
}
Et un truc comme ça ?
#include <OneWire.h>
OneWire ds(11);
char addr[8];
char numSerie[8] = {'A','B','C','D','0','1','2','3'};
void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
if(getKeyCode())
if( verifieNumeroSerie(addr, numSerie)) {
Serial.println("Numero série:");
Serial.println(addr);
Serial.println("Correct !");
}
delay(1000);
}
boolean getKeyCode(){
if ( !ds.search(addr)) {
ds.reset_search();
Serial.print("DS1992 introuvable");
return false;
}
if ( addr[0] != 0x08) {
Serial.print("ce n est pas un DS1992");
return false;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
error = true;
Serial.print("CRC invalide");
return false;
}
ds.reset();
return true;
}
void verifieNumeroSerie(char* numeroSerie, char* numeroSerieCorrect){
if(strlen(numeroSerie) != strlen(numeroSerieCorrect)) return false;
int charCorrect=0;
for(int i=0; i<strlen(numeroSerie);i++)
if(numeroSerie[i] == numeroSerieCorrect[i]) charCorrect++;
if(charCorrect == strlen(numeroSerie))
return true
else
return false;
}
J'ai des erreurs que je ne comprend pas ![]()
sketch_jun23a.cpp: In function 'void loop()':
sketch_jun23a:14: error: could not convert 'verifieNumeroSerie(((char*)(& addr)), ((char*)(& numSerie)))' to 'bool'
sketch_jun23a.cpp: In function 'boolean getKeyCode()':
sketch_jun23a:23: error: invalid conversion from 'char*' to 'uint8_t*'
sketch_jun23a:23: error: initializing argument 1 of 'uint8_t OneWire::search(uint8_t*)'
sketch_jun23a:32: error: invalid conversion from 'char*' to 'uint8_t*'
sketch_jun23a:32: error: initializing argument 1 of 'static uint8_t OneWire::crc8(uint8_t*, uint8_t)'
sketch_jun23a:33: error: 'error' was not declared in this scope
sketch_jun23a.cpp: In function 'void verifieNumeroSerie(char*, char*)':
sketch_jun23a:42: error: return-statement with a value, in function returning 'void'
sketch_jun23a:49: error: return-statement with a value, in function returning 'void'
sketch_jun23a:50: error: expected ';' before 'else'
sketch_jun23a:51: error: return-statement with a value, in function returning 'void'
/facepalm
void verifieNumeroSerie -> boolean verifieNumeroSerie
J'avais même pas remarqué cette erreur ... désolé ![]()
sketch_jun23a.cpp: In function 'boolean getKeyCode()':
sketch_jun23a:23: error: invalid conversion from 'char*' to 'uint8_t*'
sketch_jun23a:23: error: initializing argument 1 of 'uint8_t OneWire::search(uint8_t*)'
sketch_jun23a:32: error: invalid conversion from 'char*' to 'uint8_t*'
sketch_jun23a:32: error: initializing argument 1 of 'static uint8_t OneWire::crc8(uint8_t*, uint8_t)'
sketch_jun23a:33: error: 'error' was not declared in this scope
sketch_jun23a.cpp: In function 'boolean verifieNumeroSerie(char*, char*)':
sketch_jun23a:50: error: expected ';' before 'else'
![]()
Bon je vais sortir le compilateur ![]()
voila voila ... j'avais oublié un ; (et cast byte<>char avez foiré)
#include <OneWire.h>
OneWire ds(11);
byte addr[8];
char numSerie[8] = {'A','B','C','D','0','1','2','3'};
void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
if(getKeyCode())
if( verifieNumeroSerie((char*)addr, numSerie)) {
Serial.println("Numero série:");
Serial.println((char*)addr);
Serial.println("Correct !");
}
delay(1000);
}
boolean getKeyCode(){
if ( !ds.search(addr)) {
ds.reset_search();
Serial.print("DS1992 introuvable");
return false;
}
if ( addr[0] != 0x08) {
Serial.print("ce n est pas un DS1992");
return false;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC invalide");
return false;
}
ds.reset();
return true;
}
boolean verifieNumeroSerie(char* numeroSerie, char* numeroSerieCorrect){
if(strlen(numeroSerie) != strlen(numeroSerieCorrect)) return false;
int charCorrect=0;
for(int i=0; i<strlen(numeroSerie);i++)
if(numeroSerie[i] == numeroSerieCorrect[i]) charCorrect++;
if(charCorrect == strlen(numeroSerie))
return true;
else
return false;
}
Arf ça ne fonctionne pas, je vois pas du tout comment faire ![]()
EDIT : Dans mon code c'est le Serial.print que j'ai commenté qui affiche le numéro de série.
ayme.32:
Arf ça ne fonctionne pas, je vois pas du tout comment faireEDIT : Dans mon code c'est le Serial.print que j'ai commenté qui affiche le numéro de série.
Le but c'est bien de vérifié que le numéro de série est bon ?
Dans ce cas mon code devrait marcher. Le numéro de série est sous quel forme ? (j'entends celui qui sert de référence il est marquer sur une étiquette ou autre chose ?)
Ouais mais dans le serial monitor ça reste sur DS1992 pas trouvé un truc du genre
Le numéro de série est gravé sur le iButton.
EDIT : J'arrive bien à récupérer le serial mais faut qu'il soit convertit en HEX.
Le iButton est bien cablé ?
Si le code reste bloqué au niveau de la recherche de l'adresse c'est qu'il y a un problème soit de câblage, soit d'utilisation de la librairie
pour le câblage regarde ici :
http://tushev.org/articles/electronics/35-reading-ibutton-with-arduino
Edit:
Le serial n'est pas directement en hexa ? Bon alors il y a plus simple !
#include <OneWire.h>
OneWire ds(11);
byte addr[8];
byte numSerie[8] = {
0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
if(getKeyCode())
if( verifieNumeroSerie(addr, numSerie)) {
Serial.println("Numero série:");
for(int i=0; i<8;i++)
Serial.print(addr[i],HEX);
Serial.println();
Serial.println("Correct !");
}
delay(1000);
}
boolean getKeyCode(){
if ( !ds.search(addr)) {
ds.reset_search();
Serial.print("DS1992 introuvable");
return false;
}
if ( addr[0] != 0x08) {
Serial.print("ce n est pas un DS1992");
return false;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC invalide");
return false;
}
ds.reset();
return true;
}
boolean verifieNumeroSerie(byte* numeroSerie, byte* numeroSerieCorrect){
int charCorrect=0;
for(int i=0; i<8;i++)
if(numeroSerie[i] == numeroSerieCorrect[i]) charCorrect++;
if(charCorrect == 8)
return true;
else
return false;
}
En écrivant le numéro de série sous la forme 0xAA (ou AA est la partie en hexa) le compilateur va traduire le tout en int et hop plus de conversion à faire.
Ensuite pour afficher la valeur en hexa sur le serial monitor, serial.print(blabla,HEX).
Avec mon code ça fonctionne très bien le moniteur série affiche bien le sérial mais après je veux le stocker dans une variable pour faire une condition genre :
if (serial == "BLABLBLABLA") {
Serial.print("ouais bon ibutton");
} else {
Serial.print("mauvais ibutton");
}
Mais quand je le stocke ça fait un truc bizarre comme quand je vire le HEX du Serial.print(addr*, HEX);*
normal ce n'est pas un char mais des byte[].
As tu tenté mon code ?
Change { 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA} par ton serial en hexa et normalement cela devrait fonctionner.
exemple 0x27,0x00,0x00,0x00,0x95,0xC3,0x31,0x08 (ex du site maxim)
Ton code ne reconnaît pas mon DS1992 ![]()