Skocz do zawartości
SOYER

Arduino (?) i GSM

Pomocna odpowiedź

(edytowany)

Cześć, z racji odrobiny wolnego w sobotę, udało mi się z pewnymi kłopotami zaimplementować komunikaty głosowe do mojego alarmu.

Z jakiegoś powodu jeśli komenda dla DFPlayera była tuż przed komendami dla SIM800l, to działy się dziwne rzeczy, układ się resetował tuż przed wysłaniem sms, a same sms zawierały dziwną treść, nie tą którą wpisywaliśmy w komendzie. Kombinowałem z zasilaniem, delay-ami, ale na próżno. Obsłużenie najpierw SIM800, a dopiero tuż za nim DFPlayera, całkowicie rozwiązało problem.

Teraz pozostał tylko czytnik RFID i przy okazji ekspanderek mały, bo w UNO piny się skończyły....

Krótki filmik z działania, pin nieprawidłowy, prawidłowy, uzbrajanie, rozbrajanie, dzwonienie do centralki wraz z podaniem PINu przez DTMF i reakcja na to..., w tle można usłyszeć dźwięk przychodzących sms-ów z powiadomieniami o zmianie stanu alarmu:

 

 

Edytowano przez SOYER
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć, trochę się dzisiaj przymierzałem do tego czytnika RFID. Udało się go odpalić, wpisać nazwy użytkowników kart i breloków, odczytać te nazwy...

Niżej kod do czytania nazwy właściciela karty/breloka, oczywiście z zastosowaniem dedykowanej biblioteki:

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

//*****************************************************************************************//
void setup() {
  Serial.begin(9600);                                           // Initialize serial communications with the PC
  SPI.begin();                                                  // Init SPI bus
  mfrc522.PCD_Init();                                              // Init MFRC522 card
  //Serial.println(F("Read personal data on a MIFARE PICC:"));    //shows in serial that it is ready to read
}

//*****************************************************************************************//
void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
    for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  //some variables we need
  byte block;
  byte len;
  MFRC522::StatusCode status;

  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  
//Serial.print(F("Name: "));
  byte buffer1[18];
  block = 4;
  len = 18;

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid));
  status = mfrc522.MIFARE_Read(block, buffer1, &len);

  for (uint8_t i = 0; i < 16; i++)
  {
    if (buffer1[i] != 32)
    {
      Serial.write(buffer1[i]);
    }
  }
  
  Serial.print("  ");
  
   mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

Ciekawi mnie linijka:

Serial.print("  ");

co to w ogóle jest, dlaczego wpisanie pustego cydzysłowia powoduje wypisanie jakieś treści???

Można tak oczywiście

 String imie = (" ");
  Serial.print(imie);

ale co z tym cydzysłowiem...?

 

Proszę napiszcie też, czy taki moduł komunikujący się po SPI może pracować z PCF8574 po I2C, czy też musi być na konkretnych pinach UNO, a ekspander wtedy muszę wykorzystać do wysterowania innych peryferii?

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites
29 minut temu, SOYER napisał:

dlaczego wpisanie pustego cydzysłowia powoduje wypisanie jakieś treści???

Ten cudzysłów nie jest "pusty" - tam są dwie spacje 🙂 Jakieś formatowanie tekstu?

33 minuty temu, SOYER napisał:

czy taki moduł komunikujący się po SPI może pracować z PCF8574 po I2C

Jeśli "ten moduł" ma interfejs I2C to dlaczego by nie? SPI i I2C to dwa różne interfejsy.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Moduł ma SPI, ciekawi mnie czy podpięcie ekspandera portów od strony Arduino do dowolnego pinu, a z drugiej do RFID rc522 zadziała... 

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites

O ile napiszesz do tego bibliotekę to zadziała[1]... tyle że będzie to przypominało rower, w którym pedałami napędzasz prądnicę, ta napędza dwa silniki umieszczone nad kołami, które z kolei napędzają prądnice zasilające silniki w piastach kół.

--

[1] SPI nie ma "minimalnej prędkości", a to że w takim przypadku zegar SPI wyjdzie gdzieś w okolicach struny E w basie to sprawa oczywiście pomijalna.

Udostępnij ten post


Link to post
Share on other sites

Czyli rozumiem, że SPI musi być na konkretnych pinach arduino, a dokładniej MOSI, MISO I SCL, tak?

 @ethanak pozostaje kwestia pustych(ze spacją) cudzysłowów w 

Serial.print(" ") ;

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, SOYER napisał:

Czyli rozumiem, że SPI musi być na konkretnych pinach arduino, a dokładniej MOSI, MISO I SCL, tak?

Tak[1].

1 godzinę temu, SOYER napisał:

pozostaje kwestia pustych(ze spacją) cudzysłowów w 

Serial.print(" ") ;

Porównaj dwa fragmenty programu:

Serial.print("Tamta");
Serial.print(" ");
Serial.println("rampa");

i

Serial.print("Tamta");
Serial.println("rampa");

Efekt działania którego z nich będzie odpowiedzią na pytanie "Gdzie mam wyładować towar", a którego tekstem używanym do śpiewania gdy zapomnimy słowa piosenki?

---

[1]Nie będziemy dywagować na temat soft-spi, prawda?

Udostępnij ten post


Link to post
Share on other sites

Udało mi się skończyć (?) centralkę. Zyskała nowy front, DFPlayera, RFID, RTC. 

Myślę jeszcze nad pamięcią zdarzeń i kilkoma dodatkowymi komunikatami głosowymi, np. o aktualnej godzinie....

Chciałem też wyświetlać temperaturę z DS-a wlutowanego w RTC, ale jak początkowo pięknie czytał temp., to teraz ciągle tylko 85 stopni... 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@ethanakpodpowiedz proszę w jaki sposób rozegrać odczyt "mówiony" np. godziny, temperatury. Za pomocą DFPlayera to tylko przychodzi mi do głowy nagranie sampli od 0 do ileś tam i zależnie od stanu zmiennej, odgrywanie konkretnych sampli.

Czy może są lepsze, ciekawsze możliwości? 

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites
Anonim
3 godziny temu, SOYER napisał:

Czy może są lepsze, ciekawsze możliwości? 

Pewnie są ale na arduino się nie zmieszczą ;) nawet w automatycznych biurach obsługi klienta są odczytywane z sampli. Zadzwoń sobie na pocztę głosową i zwróć uwagę jak są podawane liczby przez ten automat.

Udostępnij ten post


Link to post
Share on other sites

24 sample na godziny i 60 na minuty przy odtwarzaniu przez dfplayera.

Alternatywnie RPi Zero i syntezator - droższe rozwiązanie, ale nie trzeba żadnych sampli ii można powiedzieć dowolny tekst.

Udostępnij ten post


Link to post
Share on other sites

Cześć, @ethanakprzyjacielu, mam pewien problem z modułem sim800l, z jakiegoś powodu, czasami przy odczytywaniu danych z tego modułu(gsm. readString();) konkretnie wyświetlania numeru przychodzącego na serial monitorze, "gubi" się gdzieś kilka lub kilkanaście ostatnich znaków.

Różnie to bywa jednak zawsze pierwsze po resecie dodzwonienie jest ok, prawidłowo wyświetla CLIP, z następnymi jest już różnie. Może domyślasz przyczyn takiego zachowania. Coś gdzieś chyba namieszałem, bo kiedyś tego nie było. 

Udostępnij ten post


Link to post
Share on other sites

No tak...

42 minuty temu, SOYER napisał:

przy odczytywaniu danych z tego modułu(gsm. readString();)

i chyba wszystko jasne. Przeczytaj najpierw to: https://arduino.stackexchange.com/questions/682/is-using-malloc-and-free-a-really-bad-idea-on-arduino

Jeśli uświadomisz sobie, że wszystkie operacje na obiektach klasy String sprowadzają się do malloc/realloc/free powinieneś już wiedzieć o co chodzi.

Nigdy nie używaj w tego typu programach żadnych dynamicznych przydziałów pamięci poza stosem. Czyli odpadają wszelkie String, różne fajne vectory i tak dalej. Nie stosujesz String tylko bufory (mogą być statyczne, mogą być alokowane na stosie). Nie używasz readString tylko readBytes (to się tyczy również readStringUntil i wszelkich operacji alokujących sobie radośnie pamięć). Nie używasz wektorów tylko tablic.

To o czym piszesz to typowy objaw braku pamięci. Kiedyś nie było bo program balansował na granicy dostępnego ramu - teraz jest bo granicę przekroczyłeś. Pomyśl o przejściu na coś większego niż atmega (i nie mówię tu o 2560). Może jakiś większy STM? Może ESP32? ESP8266 ma chyba za mało pinów do tego co robisz... ESP32 możesz śmiało programować w Arduino IDE, STM-y podobno też (nie sprawdzałem). Ale to też nie znaczy, że możesz sobie szafować RAM-em jak na pececie - bo nawet ESP z jego półmegową pamięcią możesz łatwo wysadzić w powietrze jakimiś wyciekami.

Mam nadzieję że pomogłem...

 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...