Skocz do zawartości

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
(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
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.

(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

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.

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(" ") ;

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?

  • 2 tygodnie później...

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... 

(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
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.

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.

  • 3 tygodnie później...

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. 

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...

 

  • 10 miesiące później...

Cześć, dzisiaj trochę poszkoliło mnie nodeMCU na spółkę z dfplayerem. Za Chiny ludowe nie chciały gadać ze sobą. Nawet myślałem , że walnięty ale na ręczne komendy player reagował, a z ESP nie gadał.

NodeMCU podpięty do przetwornicy 5V i z tej samej przetwornicy 5V idzie na VIN nodeMCU.

Okazało się, że trzeba wypiąć kabel USB po załadowaniu programu, włączyć przetwornicę i dopiero wtedy ew. znowu podpinamy USB i... wszystko działa...🤔🤔🤔

Dlaczego takie dziwne zachowanie ?

Zapomniałem napisać, że komunikacja po software serialu...

A na którym pinie masz softwareserial (GPIO, a nie te durne numerki z NodeMCU)?

Przy okazji: ESP8266 ma dwa UARTy, ale z drugiego możesz wykorzystać tylko Tx. Możesz również przełączyć piny Serial z 0/2 na 13/15 - vide Serial.swap()

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...