Wyświetlenie tablicy znaków.

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 1 maja 2014, 15:38

Mam pewną funkcję która wygląda następująco:

Kod: Zaznacz cały

    ....
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1");
    delay(1000);
    mySerial.println("AT+CMGS=\"+48222123456\"");
    delay(1000);
    mySerial.println("Cześć pomożesz mi?");
    delay(1000);
W jaki sposób używając tablicy znaków w której mam zapisane numery telefonu wysłać np w/w wiadomość. (podany powyżej kod jest poprawny gdy chcemy wysłać wiadomość to tylko jednego ściśle określonego numeru jw.)

Komenda która wysyła numer telefonu do urządzenia musi mieć postać:

Kod: Zaznacz cały

mySerial.println("AT+CMGS=\"+48222123456\"");
Gdy próbuję to zmienić na np.

Kod: Zaznacz cały

mySerial.print("AT+CMGS=");
mySerial.println(numeryArray[i]);
komenda tak jakby "kończy swoje działanie" a (tak przynajmniej myślę) wyświetlony numer tel. z tablicy jest bodajże treścią wiadomości, czyli zastępuje wiadomość:"cześć, pomożesz mi?". Tym samym wiadomości nie są wysyłane.

Czy istnieje możliwość wysłania komendy z podanym numerem telefonu jednym mySerialem?

Ps. na chwilę obecną, NIEDZIAŁAJĄCY kod wygląda następująco:

Kod: Zaznacz cały

for (i = 0; i < iloscnumerow; i++) {
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1"); 
    delay(1000);
    //mySerial.println("AT+CMGS=\"+48222123456\"");
    mySerial.print("AT+CMGS=");
    mySerial.println(numeryArray[i]);
    delay(1000);
    mySerial.println("Cześć pomożesz mi?");
    delay(1000);

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


Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 1 maja 2014, 17:00

Witam
do tego co Ci podał Karpi dodam przykład z 3 numerami:

Kod: Zaznacz cały

char *telefony[]={"+48784232050","+48123456789","+48987654321"};
a potem w kodzie dokładasz:

Kod: Zaznacz cały

mySerial.println("AT+CMGS=\""+telefony[0]+"\""); //lub telefony[1] , telefony[2]
możesz także wszystkie numery mieć zapisane w EEPROM lub na karcie... kwestia odczytu....
Pozdrawiam
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 1 maja 2014, 19:44

Witam serdecznie Panów ;)

Krapi, wszystko fajnie ale w Twoim przykładzie muszę tworzyć "nieskończenie" dużo zmiennych-stringów. Moją ideą jest to by np do max 10 numerów była wysyłana ta sama treść wiadomości i spokojnie nie będzie to żaden spam :)
Zapisując te numery do tablicy znaków mógłbym biegać po indexach a nie tworzyć zmiennych i wczytywać je jednym for-em.

wojtekizk, czy definiując tablicę telefony[] nie muszę ją zdefiniować w ten sposób:

Kod: Zaznacz cały

telefony[2][13]={"+48123456789", "+48987654321"};
czyli tablica dwuwymiarowa podająca ilość elementów tablicy (2) oraz długość łańcucha znaków (13)? Pamiętam że gdy tworzyłem tablicę to nie szło inaczej tego zrobić - po prostu znam tylko ten sposób.
Poza tym, czy nie mogę wrzucić tam for-a i z automatu wczytać wszystkie numery z tablicy czyli tablica,
np.

Kod: Zaznacz cały

void wyslijsmsa() {
for (i = 0; i < iloscnumerow; i++) {
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1"); 
    delay(1000);
    mySerial.println("AT+CMGS=\"" +telefony[i]+ "\"");
    ...
bo inaczej to mając 10 numerów musiałbym tworzyć 10 funkcji - jeśli dobrze zrozumiałem? :-/
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 1 maja 2014, 20:26

Witam
Tablice można tworzyć na co najmniej 3 sposoby. Ten twój jest jak najbardziej poprawny... ale musisz z góry wiedzieć ile będzie numerów i ile znaków przeznaczasz na każdy z nich. Ja w przykładzie tworzę tablicę dwuwymiarową trochę sprytniej, bo używając wskaźnika nie muszę znać ani ilości numerów, ani ilości znaków. Ta konstrukcja umożliwia dopisywanie numerów pomiędzy nawiasy { } bez konieczności ciągłego liczenia, ile z nich masz już dopisanych.
Pozdrawiam
ps. jasne, że najwłaściwsze będzie for :-)... jeszcze lepsze byłoby tylko while(tablica) .... bo wtedy nawet nie musisz wiedzieć ile masz numerów w swojej "książce telefonicznej"... wystarczy tylko jak w pętli whille będziesz inkrementował zmienną i ( i++;)
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 3 maja 2014, 10:13

wojtekizk, próbowałem pozostać przy swoim rozwiązaniu, ale zmieniając kod wg Twojej podpowiedzi na następujący:

Kod: Zaznacz cały

void wyslijsmsa() {
for (i = 0; i < iloscnumerow; i++) {
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1"); 
    delay(1000);
    mySerial.println("AT+CMGS=\"" +numeryArray[i]+ "\"");        // moja tablica dwuwymiarowa numeryArray[2][13] = {...
    ...
niestety otrzymuje następujący błąd kompilatora:

Kod: Zaznacz cały

SMSy.ino: In function 'void sms()':
SMSy:56: error: invalid operands of types 'const char [10]' and 'char [13]' to binary 'operator+'
zresztą, identycznie jest gdy zastosuję zapis Twojej tablicy na wskaźnikach czyli:

Kod: Zaznacz cały

char *telefony[]={"+48784232050","+48123456789","+48987654321"};

void wyslijsmsa() {
for (i = 0; i < iloscnumerow; i++) {
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1"); 
    delay(1000);
    mySerial.println("AT+CMGS=\"" +telefony[i]+ "\""); 
    ...
wtedy otrzymuję następujący błąd:

Kod: Zaznacz cały

SMSy.ino: In function 'void sms()':
SMSy:56: error: invalid operands of types 'const char [10]' and 'char*' to binary 'operator+'
Nie pasują mu argumenty ale dlaczego?

ps. Krapi, pozwól niech pozostanie to moją tajemnicą, przynajmniej na razie ;)
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 3 maja 2014, 11:11

Witam
Rzeczywiście jest problem, ale dotyczy on samej biblioteki.
Mówiąc dokładnie, ale przez to mało zrozumiale :-) brak w niej przeciążonego operatora + na rzecz obiektów klasy mySerial. Nie jest mozliwe zatem łączenie w funkcji println(...) zmiennych typu char czy string za pomocą operatora +.
Musisz wykorzystać funkcje typu strcat, ktora łączy znaki w jeden ciąg lub wcześniej w zmiennej typu String dodawać stringi jak zrobiłem to poniżej w przerobionej Twojej funkcji:

Kod: Zaznacz cały

void wyslijsmsa() 
{
   for (int i = 0; i < iloscnumerow; i++) 
  {
    String s="";
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1"); 
    delay(1000);
    s+="AT+CMGS=\"";
    s+=telefony[i];
    s+="\"";
    mySerial.println(s); 
   }
}
...aaaa i nie widzę u Ciebie w kodzie deklaracji zmiennej iloscnumerow :-)
ps. jesli bedą jeszcze jakieś problemy, to proszę wklejaj cały kod, bo potem trudno zakumać z jakich zmiennych korzystasz i co jest zadeklarowane globalnie a co lokalnie :-)
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 3 maja 2014, 15:07

Dzięki wojtekizk, jak zwykle Twoje rady i tym razem okazały się bezbłędne i trafne!

Zmienna globalna jaką jest iloscnumerow zawiera (jak sama nazwa wskazuje) ilość numerów zapisanych w tablicy. Pisałeś wcześniej o możliwości pominięcia tej zmiennej:
wojtekizk pisze: jasne, że najwłaściwsze będzie for :-)... jeszcze lepsze byłoby tylko while(tablica) .... bo wtedy nawet nie musisz wiedzieć ile masz numerów w swojej "książce telefonicznej"... wystarczy tylko jak w pętli whille będziesz inkrementował zmienną i ( i++;)

Masz na myśli coś takiego:

Kod: Zaznacz cały

int i = 0;
...
void wyslijsmsa() 
{
   while(telefony[i] > i)  
   {
  ....

   i++;
   }
}
A co do EEPROMu
wojtekizk pisze: możesz także wszystkie numery mieć zapisane w EEPROM lub na karcie... kwestia odczytu....
to rozwiązanie ciekawe ale wydaje mi się ze troszkę skomplikowałoby kod programu, chociaż jeśli chcielibyśmy sterować np modułem przekaźnikowym przy możliwych zanikach zasilania to rozwiązanie super.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 3 maja 2014, 21:32

Witam
No niezupełnie tak:

Kod: Zaznacz cały

while(telefony[i] > i) 
... bo to jest bez sensu.... pytasz po prostu tak:

Kod: Zaznacz cały

while(telefony[i]) 
...czyli w wolnym tłumaczeniu - dopóki telefony zawierają coś :-)
co do EEPROM to korzystając z biblioteki #include<EEPROM.h> obsługa zapisu i odczytu pamięci EEPROM jest banalnie łatwa:
Przykłady:
zapis:
EEPROM.write(0,23);
gdzie 0 to numer komórki pamięci, a 23 to przykładowa zapisywana wartość ( ponieważ zapisujesz bajt, to ta wartośc mieści się w zakresie od 0-255).
odczyt:
int odczyt=EEPROM.read(0); ... gdzie 0 to numer komórki pamięci.(dla UNO to zakres od 0-1023)

Prawda, że proste :-)
Pozdrawiam
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 4 maja 2014, 12:39

OK, ale gdy tak zrobię:

Kod: Zaznacz cały

void wyslijsmsa() 
{
   while(telefony[i])  
   {
  ....

   i++;
   }
}
wtedy wysyła smsy do numerów zapisanych w tablicy (obecnie 2) a następnie pętla wykonuje się jeszcze 2x.

Kod: Zaznacz cały

Arduino, czekam na Twoja reakcje...
f
AT+CMGS="+48500111111"
AT+CMGS="+48500222222"
AT+CMGS="    "
AT+CMGS="  "
stąd ten warunek i ewentualne założenie by pętla nie "latała" bez końca, ale w tym momencie nie pozbędziemy się deklaracji zmiennej...i wracamy do punktu wyjścia jak przy użyciu for-a.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 4 maja 2014, 13:14

Witam
Coż, aby to ocenić potrzebuję całego kodu niestety i kto wie może także biblioteki, bo z nimi są najczęściej problemy.
Na szybciutko sprawdzilem poprawność kodu dla zwykłego Seriala... i jest OK.
Masz tu kod testowy i sam zobacz:

Kod: Zaznacz cały

char *telefony[]={"+48784232050","+48123456789","+48987654321"};
void setup()
{
  Serial.begin(9600);
}

void loop()
{
int i=0;
while(telefony[i]){Serial.println(telefony[i]);i++;}
delay(2000);
}
...wygląda na to, że wykorzystując obiekt mySerial wkrada się jakiś błąd. Potrzebuję KODU !!! :-) Na pewno poprawnie deklarujesz tablicę?
Pozdrawiam
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 4 maja 2014, 13:53

Proszę kod:

Kod: Zaznacz cały

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);

char *telefony[] = {
  "+48500000001", "+48500000002"};

int iloscnumerow = 2; 
int i = 0;

void setup() {
  ...
}

void loop() {
  ...
}

void sms() 
{
  while (telefony[i])
  //for (i = 0; i < iloscnumerow; i++) 
  {
    String s = "";
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1");  
    delay(1000);
    s += "AT+CMGS=\"";
    s += telefony[i];
    s += "\"";
    Serial.println(s);
    mySerial.println(s);
    delay(1000);
    mySerial.println("Arduino, wiadomosc testowa.");
    delay(1000);
    mySerial.println("\x1A"); 
    ... 
    i++;
  }
}
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Wyświetlenie tablicy znaków.

Post autor: wojtekizk » 4 maja 2014, 13:59

Witam ponownie... sprawdzilem... są problemy z biblioteką, dlatego proponuję sprawdzone rozwiazanie z wbudowaną w C++ funkcją strcat. Oto poprawny kod:

Kod: Zaznacz cały

while(telefony[i])
{
    mySerial.println("AT");
    delay(1000);
    mySerial.println("AT+CMGF=1");  
    delay(1000);
char  s[22];
s[0]=0;
strcat(s,"AT+CMGS=\"");
strcat(s,telefony[i]);
strcat(s,"\"");
mySerial.println(s);
    delay(1000);
    mySerial.println("Arduino, wiadomosc testowa.");
    delay(1000);
    mySerial.println("\x1A");
i++;
}
...napisz czy teraz już działa jak należy :-)
Pozdrawiam
wojciech_69
Młodszy majsterkowicz
Posty: 36
Rejestracja: 30 gru 2013, 14:28

Re: Wyświetlenie tablicy znaków.

Post autor: wojciech_69 » 4 maja 2014, 15:05

Niestety nie działa do końca tak jak powinno.

Kod: Zaznacz cały

Arduino, czekam na Twoja reakcje...
d
ÿAT+CMGS="+48500000001"
ÿAT+CMGS="+48500000001"AT+CMGS="+48500000002"
Arduino, czekam na Twoja reakcje...
Sms-a dostaje tylko numer z 1-ką.

Pozostanę chyba przy forze. Sposób sprawdzony i działający bezbłędnie tyle że z dodatkową zmienną (iloscnumerow).

Ps. i widzę że tak jakby restartował Arduino, bo normalnie (przy forze) nie nie wyświetla ponownie:"Arduino, czekam na Twoja reakcje..."/
ODPOWIEDZ

Strony partnerskie: