Arduino Polska Forum

Pełna wersja: SIM800L i NANO czujnik zalania. Jak odliczyć czas 30 dni?
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
Witam. Mam zrobiony układ alarmujący sms-em pojawienie się wody w pomieszczeniu. Mam kartę PLAY za 5 zł na rok jest tylko warunek że trzeba zadzwonić lub wysłać smsa choć jednego w miesiącu. Nie wiem jak to rozwiązać aby wysłał smsa testowego raz w miesiącu bo jak wystąpi zalanie lub jak układ startuje to już mam. Nie chciałbym dodawać jakiegoś układu czasowego. Pozdrawiam wszystkich i czekam na pomoc.

A znalazłem coś takiego ale nie mam pojęcia jak można to przerobić aby nie ustawiało czasu w 1307 tylko właśnie odliczało i wysyłało smsa.

#include <Sim800l.h>
#include <SoftwareSerial.h> //is necesary for the library!!
Sim800l Sim800l; //to declare the library
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int day,month,year,minute,second,hour;
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}



void setup(){
Serial.begin(9600); // only for debug the results .
Sim800l.begin(); // initializate the library.

// the parameter to send is UTC of your country
Sim800l.updateRtc(); //
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
}

void loop(){
Sim800l.RTCtime(&day,&month,&year,&hour,&minute,&second);
//at this moment the variables have the real time.
// Serial.print(day);
// Serial.print('/');
// Serial.print(month);
// Serial.print('/');
// Serial.print(year);
// Serial.print(' ');
// Serial.print(hour);
// Serial.print(':');
// Serial.print(minute);
// Serial.print(':');
// Serial.print(second);
// Serial.println();
byte monthday=day;
Wire.beginTransmission(0x68);
Wire.write(0x00); //stop Oscillator

Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(day));
Wire.write(decToBcd(monthday));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));

Wire.write(0x00); //start

Wire.endTransmission();

DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
}

=========================================================================
A to program który wysyła smsa o zalaniu:
:
#include <BareBoneSim800.h>
BareBoneSim800 sim800; //
//BareBoneSim800 sim800("your APN"); //needed for gprs funtionality
int koniec = 0;
void setup() {
Serial.begin(9600);
sim800.begin();
while(!Serial);
pinMode(5, INPUT);
Serial.println("Test GSM modul SMS ");
delay(8000);
Serial.println("Should be ready by now");
bool deviceAttached = sim800.isAttached();
if (deviceAttached)
Serial.println("Device is Attached");
else
Serial.println("Not Attached");

const char* number = "+48xxxxxxxxx";
// char* message = "UWAGA!!! WODA!!! w lazience !!!!.";
char* message2 = "GSM dziala poprawnie. SMS testowy";
delay(2000);
bool messageSent = sim800.sendSMS(number, message2);
if(messageSent)
Serial.println("Message Sent");
else
Serial.println("Not Sent, Something happened");
}
void loop() {
if ((digitalRead(5) == LOW)&&(koniec == 0)) { //Jeśli sygnał z czujnika wody
bool messageSent = sim800.sendSMS("+48xxxxxxxxx","UWAGA!!! WODA w lazience. Szybko sprawdz.");
// bool messageSent = sim800.sendSMS(number, message2);
if((messageSent)&&(koniec==0))
koniec = 1;
else
Serial.println("Not Sent, Something happened");
}
if (digitalRead(5) == HIGH) {
koniec = 0;
}
delay(8000);
}
A na millis() tego nie zrobisz.
Jak startuje system to masz zrobione. Od tego momentu odlicz potrzebny czas i gotowe. Licznik millis() przekręca się raz na około 2 miesiące więc nie powinno być problemu. Nawet jak ulega przekręceniu to i tak matematyka odliczania czasu działa poprawnie.
Mając zegar na pokładzie to już "igraszka" wysłać SMSa co miesiąc.
if (dzień == 1) // wysyłasz SMSa pierwszego dnia miesiąca
{
wyślij SMS o treści
}
(28-02-2020, 09:29)Agregacik napisał(a): [ -> ]if (dzień == 1) // wysyłasz SMSa pierwszego dnia miesiąca
{
wyślij SMS o treści
}
W ten sposób, pierwszego każdego miesiąca, przez cały dzień będą wysyłane SMS.

(28-02-2020, 00:15)OMK napisał(a): [ -> ]Nie wiem jak to rozwiązać aby wysłał smsa testowego raz w miesiącu
ustaw alarm w zegarze.
(28-02-2020, 10:06)MERASerwis napisał(a): [ -> ]
(28-02-2020, 09:29)Agregacik napisał(a): [ -> ]if (dzień == 1) // wysyłasz SMSa pierwszego dnia miesiąca
{
wyślij SMS o treści
}
W ten sposób, pierwszego każdego miesiąca, przez cały dzień będą wysyłane SMS.
No tak masz rację, można dodać flagę 
if(dzień == 1 && flaga ==0)
{
wyślij SMS o treści
flaga =1;
}
if (flaga ==1 && dzień != 1)
{
flaga = 0;
}
(28-02-2020, 11:32)Agregacik napisał(a): [ -> ]
(28-02-2020, 10:06)MERASerwis napisał(a): [ -> ]
(28-02-2020, 09:29)Agregacik napisał(a): [ -> ]if (dzień == 1) // wysyłasz SMSa pierwszego dnia miesiąca
{
wyślij SMS o treści
}
W ten sposób, pierwszego każdego miesiąca, przez cały dzień będą wysyłane SMS.
No tak masz rację, można dodać flagę 
if(dzień == 1 && flaga ==0)
{
wyślij SMS o treści
flaga =1;
}
if (flaga ==1 && dzień != 1)
{
flaga = 0;
}
A gdy z jakiegoś powodu przez cały dzień urządzenie nie będzie zasilane?
W dobrze napisanym sofcie SMS powinien być wysłany gdy urządzenie odzyska zasilanie mimo, że dany dzień już minął.
Proste dla człowieka działania są trudne do opisania w algorytmie (dlatego "gwindow$" dział a raczej nie dział, jak działa czyli nie działa).
To zadanie da się dość dobrze zrealizować ale to nie takie "wgranie szkicu". Wymaga "trochę" czasu na pisanie algorytmu ("Arduinowcy" nie dopuszczają tej myśli), wdrożenie go, testy. Dlatego dobry program nie kosztuje kilkaset złotych.
Pisałem wcześniej o zrealizowaniu tego na millis() i będzie OK. Jak wstaje system to wysyła SMSa i po np 20 dniach kolejnego. Nie trzeba zegarka i kombinacji.
(28-02-2020, 16:20)Agregacik napisał(a): [ -> ]Pisałem wcześniej o zrealizowaniu tego na millis() i będzie OK. Jak wstaje system to wysyła SMSa  i po np 20 dniach kolejnego. Nie trzeba zegarka i kombinacji.
Polecanie millis to jak polecanie Trabanta jako panaceum na problemy z transportem.
Millis ma jedną zaletę - proste w użyciu, poza tym same wady, lista długa więc nie będę wypisywał co zresztą nie raz robiłem.
Hm w tym przypadku nie przychodzi mi nic do głowy co by mogło być złe w jego użyciu.
Po starcie wysyłany jest SMS , po czasie odliczonym przez millis() wysyłany jest ekstra SMS aby "zadowolić operatora", aby nie wyłączył numerku. Pozostałe SMSy przychodzą w razie potrzeby. Nie jest wymagane dokładne odliczanie czasu.
Podaj choć jedną wadę tego rozwiązania w tym przypadku.
Może Ravi Pujar pomoże https://www.youtube.com/watch?v=UriCOG7uLs4. Wystarczy wysłać SMS, zapisać czas wysłania w EEPROM, co jakiś czas sprawdzić aktualny czas, porównać z zapisanym, jak upłynie miesiąc powtórzyć operację.
Widzę, że znalazłeś to też na elektrodzie, dobrze, że spojrzałem na nik, bo bym Ci podlinkował Twojego posta.
Podoba mi się pomysł z millis. Jak nie będzie zasilania to i tak po uruchomieniu wyśle smsa. A mam jeszcze pytanie czy da się tu wykorzystać TIMERS czy piszę o czymś co nie mam pojęcia.
Mam prośbę oczyści mi ktoś i uprości "mój" program? Będę wdzięczny. A na millis to łyknie taką wartość 2 629 743 830? Bo miesiąc to chyba aż tyle?
Stron: 1 2 3