Arduino zmiana typu danych

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
marcin_rs
Młodszy majsterkowicz
Posty: 4
Rejestracja: 21 lis 2019, 14:43

Arduino zmiana typu danych

Post autor: marcin_rs » 21 lis 2019, 15:00

Witam

Jestem początkującym w arduino, małe projekciki robię metodą "prób i błędów". Postanowiłem tu napisać, gdyż mam problem, z którym nie mogę sobie poradzić. Mam arduino nano, karte ethernet, kilka czujników DS, które chcę przesłać lanem.

Problem leży gdzie indziej - jak zamienić efekt końcowy - wysyłany na "Serial.print" na zmienną typu String?

Programik wygląda tak:

Kod: Zaznacz cały


#include <OneWire.h>

OneWire  ds(2);

unsigned int czas_konwersji = 100;
unsigned int interwal_odczytu = 5000;
unsigned int cykl = 0;

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

void loop(void) {

// ##########################

byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius;

cykl = cykl+1;

if ( !ds.search(addr)) { //brak nastepnych czujnikow na pinie 2 

cykl = 0;
Serial.println("");
delay(interwal_odczytu);

ds.reset_search();

return;
}

Serial.print("p"); Serial.print(cykl); Serial.print("=$czujnik_"); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); }

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

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(czas_konwersji);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
 
  for ( i = 0; i < 9; i++) { data[i] = ds.read(); }         // we need 9 bytes

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  Serial.print("=");
  Serial.print(celsius);
  Serial.print(";&");
}

program wyświetla mi to coś w stylu:

p1=$czujnik_28FF646B621744B=25.00;&p2=$czujnik_28FFCA4E621742B=25.00;&p3=$czujnik_28FF314262174EF=25.00;
p1=$czujnik_28FF646B621744B=25.00;&p2=$czujnik_28FFCA4E621742B=25.00;&p3=$czujnik_28FF314262174EF=25.00;

potrzebuję zrobić z tego String dane = "to co genetuje..."

poległem, proszę o pomoc - naprowadzenie jak to zrobić,

pozdrawiam.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1188
Rejestracja: 18 lis 2011, 02:18

Re: Arduino zmiana typu danych

Post autor: Marhef » 21 lis 2019, 15:37

Tak się wyświetla, bo tak jest ustawione w programie.
To, co leci do komputera jest zawarte w funkcjach Serial.print().
Po co Ci zapisanie tego w Stringu?
wchpikus
Majsterkowicz
Posty: 69
Rejestracja: 7 lut 2015, 20:59

Re: Arduino zmiana typu danych

Post autor: wchpikus » 21 lis 2019, 17:30

Serial.print("=$czujnik_"); for( i = 0; i < 8; i++) { Serial.print(addr, HEX); }...


Sam wyswietlasz adresy czujnikow..

Wysłane z mojego SM-G950F przy użyciu Tapatalka

marcin_rs
Młodszy majsterkowicz
Posty: 4
Rejestracja: 21 lis 2019, 14:43

Re: Arduino zmiana typu danych

Post autor: marcin_rs » 21 lis 2019, 17:50

Chcę zapisać w stringu żeby wysyłać to funkcja GET
marcin_rs
Młodszy majsterkowicz
Posty: 4
Rejestracja: 21 lis 2019, 14:43

Re: Arduino zmiana typu danych

Post autor: marcin_rs » 21 lis 2019, 20:18

jak to zapisać do tablicy:

Kod: Zaznacz cały


for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); }

//robie tak ale nie zapisuje całego ciagu
for( i = 0; i < 8; i++) { adresy_czujnikow [i] = (addr[i], HEX); }

uzi18
Majsterkowicz
Posty: 100
Rejestracja: 10 maja 2018, 05:06

Re: Arduino zmiana typu danych

Post autor: uzi18 » 22 lis 2019, 00:05

co i jak chcesz wysłać?
daj dokladny przyklad

bo wydaje mi sie ze chcesz sie polaczyc do serwera http i wyslac dane?

Wysłane z mojego MI MAX przy użyciu Tapatalka

marcin_rs
Młodszy majsterkowicz
Posty: 4
Rejestracja: 21 lis 2019, 14:43

Re: Arduino zmiana typu danych

Post autor: marcin_rs » 22 lis 2019, 01:30

Dokładnie tak chce zrobić, powyżej jest kod taki jak ma być ale jest wysyłany na serial.print a potrzebuje to mieć jako zmienną string aby wstawić do GET, zacząłem kombinować z tablicami ale coś nie wyszło patrz powyżej.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1188
Rejestracja: 18 lis 2011, 02:18

Re: Arduino zmiana typu danych

Post autor: Marhef » 22 lis 2019, 09:16

Zamiast Serial.print() daj zmienna += (to, co w nawiasach w Serial.print())
uzi18
Majsterkowicz
Posty: 100
Rejestracja: 10 maja 2018, 05:06

Re: Arduino zmiana typu danych

Post autor: uzi18 » 22 lis 2019, 09:27

@Marhef zasadniczo latwiej zmienić ten Serial. na client. a i tak wczesniej trzeba otworzyc do niego połączenie :)

zerknij na przyklady typu http client example

Wysłane z mojego MI MAX przy użyciu Tapatalka


Awatar użytkownika
Marhef
Złota rączka
Posty: 1188
Rejestracja: 18 lis 2011, 02:18

Re: Arduino zmiana typu danych

Post autor: Marhef » 22 lis 2019, 09:39

Ja się nie znam na arduino. Kolega chciał zamienić na Stringa, więc to się powinno sprawdzić
stiven
Złota rączka
Posty: 1594
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Arduino zmiana typu danych

Post autor: stiven » 22 lis 2019, 11:48

marcin_rs pisze:
21 lis 2019, 20:18
jak to zapisać do tablicy:

Kod: Zaznacz cały


for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); }

//robie tak ale nie zapisuje całego ciagu
for( i = 0; i < 8; i++) { adresy_czujnikow [i] = (addr[i], HEX); }

Zapis jest dobrze zrobiony, a problem jest gdzieś indziej. Jakiego typu jest tablica adresy_czujnikow []? Jeśli typu char, to tu jest problem, bo typ char przyjmuje wartości od -128 do 127 (Jak sam możesz zobaczyć, 1 bajt to 2 znaki w hex, a char to 1 znak, żeby było dobrze, to być musiał podzielić najpierw wartość HEX na 2 osobne znaki i mieć tablice z 16 polami. Przy odczytywaniu u Ciebie przy rzutowaniu na hex wyświetlają się 2 znaki, ale na pewno nie są to te same, które były przy wpisywaniu jeśli wartość przekraczała 127, bo nastąpiło przekroczenie zakresu zmiennej). Więc zamiast char użyj na przykład byte, on przyjmuje wartości od 0 do 255, dokładnie tyle ile potrzebujesz.
To o czym pisze @Marhef, to możesz tak zrobić:

Kod: Zaznacz cały

  String adresy_czujnikow;		//deklaracja zmiennej typu String

  adresy_czujnikow = "";	//wyczyszczenie stringa przed ponownym wykorzystaniem
  for( i = 0; i < 8; i++) { adresy_czujnikow += (addr[i], HEX); }


EDIT
Właściwie jak pisałeś, chciałeś mieć stringa, to pewnie użyłeś tak jak pisałem zmiennej char i potem już nie robiłeś wyświetlania w hex, tylko bezpośrednio i miałeś 8 znaków. No ale to tak nie zadziała z tego powodu, o którym pisałem wcześniej. Jeśli użyjesz typu byte do tablicy, to później przy wyświetlaniu trzeba będzie też wykonać to rzutowanie na hex, czyli

Kod: Zaznacz cały

Serial.print(adresy_czujnikow [i], HEX)
A jak użyjesz zmiennej String, to tam chyba jeszcze trzeba zrobić dodatkowe rzutowanie na typ String, czyli

Kod: Zaznacz cały

for( i = 0; i < 8; i++) { adresy_czujnikow += String(addr[i], HEX); }
chociaż też nie jestem już pewny czy to prawidłowo zadziała.
uzi18
Majsterkowicz
Posty: 100
Rejestracja: 10 maja 2018, 05:06

Re: Arduino zmiana typu danych

Post autor: uzi18 » 22 lis 2019, 18:20

niestety ale taka konwersja adresu z tablicy na string jest wadliwa, bo np liczby ponizej 16 nie beda uzupelnione o zero z. lewej

mozna przyjac ze to i tak przejdzie bo za. kazdym razem bedzie generowany taki sam jednak niepoprawny z punktu widzenia adresu jako takiego

Wysłane z mojego MI MAX przy użyciu Tapatalka

ODPOWIEDZ

Strony partnerskie: