• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino UNO + SIM900A
#6
Nie wiem czy Ci tym pomogę, ale przesyłam kod alarmu, który kiedyś wymyśliłem na arduino nano i SIM800L
Są to moje wypociny pewnie z przed dwóch lat więc specjalistów proszę o wyrozumiałość. Wtedy jeszcze raczkowałem a teraz uczę się chodzić Smile.


Kod:
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
SoftwareSerial SMS(10, 11);
#define termometry A1 //pin do którego podłączone są termometry
#define woltomierz A2 //pin z którego czytana jest wartość napiecia akumulatora
#define napSieci A3   //pin z którego czytana jest obecność sieci 230V
String siec = "BRAK";
String nap ;
float napiecie = 0;//Napięcie akumulatora 12V (10,5V -14V) zakes od 0V do 15V
//byte siec = 0; //stan sieci ustawione wstępnie na 0 czyli brak
int tempWew; // temperatura wewnętrzna (zmienna)
int tempKotla; // temperatura kotła (zmienna)
OneWire oneWire(termometry); //Podłączenie do pinu termometry
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
//unikalne adresy czujników 18B20
//Trzeba je odczytać programem Plik → Przykłady → OneWire → DS18x20,
DeviceAddress termometrWewnetrzny = { 0x28, 0x61, 0x64, 0x12, 0x78, 0x74, 0x38, 0xE0 };
DeviceAddress termometrKotla = { 0x28, 0x61, 0x64, 0x12, 0x7B, 0xC3, 0x92, 0xB9 };
//DeviceAddress termometrKotla = { 0x28, 0x61, 0x64, 0x12, 0x7B, 0xCB, 0x20, 0x41 };

//unsigned long aktualnyCzas = 0 ;
unsigned long zapamietanyCzas = 0 ;

char incomingByte;
String inputString;
String stanAlarmu ;
int relay = 13; // Wyjście do sterowania przekaźnikiem

String text0; //deklaracja zmiennej wysyłana smsem

//zmienne podstawiane do "text" w zależnosci od alarmu czy potwierdzenia akcji
const String text1 = "wykryto ruch pom 1\n";
const String text2 = "zanik ruchu pom 1\n";
const String text3 = "wykryto ruch pom 2\n";
const String text4 = "zanik ruchu pom 2\n";
const String text5 = "wykryto ruch pom 3\n";
const String text6 = "zanik ruchu pom 3\n";
//char* text7;
String text8 = "ALARM START";
const String text9 = "OK";
//numery na które bedą wysyłane smsy i sprawdzane czy z tych numerów przychodzą poecenia
char* numer;
char* numer1;
char* numer2;
char* numerA1;
char* numerA2;
//wskaźniki czujek ruchu zapami
byte stan;
byte stanzap1;
byte stanzap2;
byte stanzap3;

byte alarm; //blokada alarmu 0 , czuwanie alarmu 1 , ustawia to program SMSem
byte a = 5; //taki wskaźnik do pomiarów napiecia na akumulatorze
byte s = 1; //taki wskaźnik czy jest sieć
byte k = 0; // taki wskaźnik do pomiaru temperatury kotła
byte tw = 0; //taki wskaźnik do pomiaru temperatury pomieszczenia

void setup()
{
  //zerowanie sim800L
  pinMode (2 , OUTPUT);
  digitalWrite (2, LOW);
  delay (1000);
  digitalWrite (2, HIGH);
  delay (5000);         // czs na inicjację sim80L po zerowaniu
  sensors.begin(); //Inicjalizacja czujnikow temperatury
  pinMode(napSieci, INPUT);
  pinMode(relay, OUTPUT);
  digitalWrite(relay, LOW); // Stan wyjścia przekaźnikowego po uruchomieniu układu
  SMS.begin(9600);       // start UARTa programowego nazwanego SMS
  Serial.begin(9600);    // start UARTa serial monitora
  delay(100);
  pinMode(12, INPUT);
  //Wstepne ustawienie wskaźników czujek ruchu
  stan     = 0;
  stanzap1 = 0;
  stanzap2 = 0;
  stanzap3 = 0;
  alarm    = 1; //ustawienie alarmu w stan czuwania czyli aktywny
  //nemery na które wysyłne będą smsy
  numer1 = "AT+CMGS=\"+48xxxxxxxxx\"\r";
  numer2 = "AT+CMGS=\"+48yyyyyyyyy\"\r";
  //Te numery będą sprawdzane czy z nich przyszedł sms
  numerA1 = "+48xxxxxxxxx";
  numerA2 = "+48yyyyyyyyy";


  //sprawdzenie komunikacji z sim800L
  while (!SMS.available()) {
    SMS.println("AT");
    delay(1000);
    Serial.println("Connecting...");
  }

  Serial.println("Connected!");//potwierdzenia że OK

  SMS.println ("ATE0");//wyłączenie echa
  delay (1000);
  SMS.println ("ATQ1");//wyłączenie potwierdzeń
  delay (1000);
  SMS.println("AT+CMGF=1"); //Ustawiamy SMSy w tryb tekstowy
  delay(1000);
  SMS.println("AT+CNMI=1,2,0,0,0"); //Procedura, która obsługuje nadchodzące wiadomości
  delay(1000);
  SMS.println("AT+CMGL=\"REC UNREAD\""); // Komdenda odczytu nowych wiadomości
  delay(5000);
}

// Pętla...........................

void loop()
{
  czujniki (); //sprawdzenie stanu czujników i przy wykryciu zmiany wysłanie SMSa
  recievemessage(); //czy przyszedł SMS

  //wykonanie pomiarów i sprawdzenie stanu sieci co określony czas
  if (millis () - zapamietanyCzas > 20000UL)
  {
    pomiary ();
    //wydrukPomiarowNaSerial ();
    zapamietanyCzas = millis () ;
  }

}

//Podprogramy................................

void czujniki () {
  text0 = "";
  stan = digitalRead(12); //odczyt stanu czujnika 1
  if ((stan == 1) && (stanzap1 == 0)) {
    text0 = text0 + text1;
    stanzap1 = 1;
  }
  if ((stan == 0) && (stanzap1 == 1)) {
    text0 = text0 + text2;
    stanzap1 = 0;
  }
  stan = digitalRead(12); //odczyt stanu czujnika 2
  if ((stan == 1) && (stanzap2 == 0)) {
    text0 = text0 + text3;
    stanzap2 = 1;
  }
  if ((stan == 0) && (stanzap2 == 1)) {
    text0 = text0 + text4;
    stanzap2 = 0;
  }
  stan = digitalRead(12); //odczyt stanu czujnika 3
  if ((stan == 1) && (stanzap3 == 0)) {
    text0 = text0 + text5;
    stanzap3 = 1;
  }
  if ((stan == 0) && (stanzap3 == 1)) {
    text0 = text0 + text6;
    stanzap3 = 0;
  }
  //tutaj zapada decyzja czy wysłać SMSa o zmianie stanu czujek ruchu
  if ((alarm == 1) && (text0 != "")) {
    wysPow ();
  }

}

void sendmessage()
{
  SMS.println(numer);
  delay(1000);
  SMS.println(text0);// wysyłany tekst
  delay(100);
  SMS.println((char)26);// ASCII code of CTRL+Z
  delay(5000);
}
void recievemessage()
{
  if (SMS.available()) {
    delay(100);

    // Serial Buffer
    while (SMS.available()) {
      incomingByte = SMS.read();
      inputString += incomingByte;
    }

    delay(10);

    inputString.toUpperCase(); // Zmiana wszystkich liter na wielkie w odebranej wiadomości

    //Sprawdzenie czy SMS przyszedł dozwolonego numeru
    //i ustawienie numeru do odesłania SMSa
    byte z = 0 ;

    if (inputString.indexOf(numerA1) > -1) {
      numer = numer1;
      z = 1;
    }
    if (inputString.indexOf(numerA2) > -1) {
      numer = numer2;
      z = 1;
    }
    //Gdy Z==1 czytamy dalej wiadomość i sprawdzamy co nadawca chce od systemu
    if (z == 1) {
      //Serial.print("z = ");
      //Serial.println(z);
      //Serial.println("numer OK");

      if (inputString.indexOf("ON") > -1) {
        digitalWrite(relay, HIGH);
      }
      if (inputString.indexOf("OFF") > -1) {
        digitalWrite(relay, LOW);
      }
      //sterowanie alarmem

      if (inputString.indexOf("ALARMSTART") > -1) {
        alarm = 1; //załaczenie alarmu
        //Serial.print ("alarm START alarm = ");
        //Serial.println (alarm);
        text8 = "ALARM START"; //tekst dodawany do stringa przy wysyłaniu stanu
        text0 = text9;
        sendmessage();
      }

      if (inputString.indexOf("ALARMSTOP") > -1) {
        alarm = 0; //wyłączanie alarmu
        //Serial.print ("alarm STOP alarm = ");
        //Serial.println (alarm);
        text8 = "ALARM STOP";//tekst dodawany do stringa przy wysyłaniu stanu
        text0 = text9;
        sendmessage();
      }

      //Sprawdzenie stanu systemu alarmowego

      if (inputString.indexOf("STAN") > -1) {
        stanAlarmu = text8 + "\nRuch " + String (stanzap1) + String (stanzap2) + String (stanzap3) + "\nSiec " + siec + "\nAkum " + String (napiecie) + " V\nAkum " + nap + "\nTemp kotla " + String (tempKotla) + "*C\nTemp pom " + String (tempWew) + "*C";
        text0 = stanAlarmu;
        sendmessage();
      }
      z = 0;
    }
    delay(50);

    // Tutaj kasujemy wiadomości w modemie, aby oszczędzać pamięć
    if (inputString.indexOf("OK") == -1) {
      SMS.println("AT+CMGDA=\"DEL ALL\"");

      delay(1000);
      //Serial.println ("wiadomości skasowane");
    }

    inputString = "";

  }
}

void pomiary () {
  napiecie = analogRead(woltomierz) * (15.0 / 1024.0); //Przeliczenie wartości na napięcie
  Serial.println(napiecie);
  if ((napiecie < 12) && (napiecie >= 10.5) ) {
    nap = "NAPIECIE NISKIE";
    if ( a != 3 ) {
      text0 = nap;
      wysPow ();
      a = 3 ;
    }
  }

  if ( (napiecie < 13) && (napiecie >= 12) ) {
    nap = "BRAK LADOWANIA";
    if ( a != 4 ) {
      text0 = nap;
      wysPow () ;
      a = 4 ;
    }
  }

  if (napiecie < 10.5) {
    nap = "NAPIECIE KRYTYCZNE";
    if ( a != 2 ) {
      text0 = nap;
      wysPow () ;
      a = 2 ;
    }
  }
  if (napiecie >= 13 ) {
    nap = "NAPIECIE OK";
    if ( a != 5 ) {
      text0 = nap;
      wysPow();
      a = 5 ;
    }
  }
  sensors.requestTemperatures(); //Pobranie temperatury czujnik
  tempWew = sensors.getTempC(termometrWewnetrzny);
  if ((tempWew < 5) && ( tw == 0 )) {
    text0 = "TEMP POM NISKA";
    wysPow ();
    tw = 1;
  }
  if ((tempWew > 6) && (tw == 1)) {
    text0 = "TEMP POM OK";
    wysPow ();
    tw = 0;
  }
  //Pomiar temperatury kotła i wysłanie SMSa jak jest za wysoka
  tempKotla = sensors.getTempC(termometrKotla);
  if ((tempKotla > 80) && ( k == 0 )) {
    text0 = "TEMP KOTLA WYSOKA";
    wysPow ();
    k = 1;
  }
  if ((tempKotla < 70) && ( k == 1)) {
    text0 = "TEMP KOTLA OK";
    wysPow ();
    k = 0;
  }
  //sprawdzenie czy jest sieć i wysłanie wiadomości
  if (1 == digitalRead(napSieci)) {
    siec = "OK";
    if ((1 == digitalRead(napSieci)) && (s == 0)) {
      text0 = "Siec OK";
      wysPow ();
      s = 1;
    }
  }
  if (0 == digitalRead(napSieci)) {
    siec = "BRAK";
    if ((0 == digitalRead(napSieci)) && (s == 1)) {
      text0 = "Brak sieci";
      wysPow ();
      s = 0;
    }
  }
}

void wysPow ()
{
  numer = numer1;
  sendmessage();
  //numer = numer2;
  //sendmessage();
}
/*
  void wydrukPomiarowNaSerial (){
  Serial.println ("AKUMULATOR " + nap);
  Serial.println ("napięcie sieci " + siec );
  Serial.println("Aktualna temperatura 0 = " + String(tempWew) + " *C" );
  //Serial.print(tempWew);
  //Serial.println(" *C");
  Serial.print("Aktualna temperatura 1 = ");
  Serial.print(tempKotla);
  Serial.println(" *C");
  Serial.print("Napięcie ");
  Serial.print(napiecie);
  Serial.println(" V");
  Serial.println ();

  }
*/


Może podpatrzysz i zastosujesz coś u siebie. Ja korzystałem z komend AT w komunikacji z SIM600L
Alarm miał posiadać 3 czujniki ruchu oraz kontrolował stan zasilania centrali alarmowej oraz temperatury w pomieszczeniu oraz temperaturę na kotle CO na paliwo stałe. Przy wykryciu ruchu podczas aktywnego alarmu miał wysłać SMSa i po zaniku ruchu też, ponadto przy zmianie pozostałych parametrów poza ustalone granice.
Alarm można było aktywować i dezaktywować zdalnie SNSem w każdym stanie można było "poprosić" o status
Alarm działał na płytce stykowej, ale nie doczekał się ostatecznej realizacji.
Zapewne wiele mu brakuje ale brak zapotrzebowania nie wymuszał jego rozwoju czy zmian.
 
Odpowiedź
  


Wiadomości w tym wątku
Arduino UNO + SIM900A - przez hugobossbb - 11-03-2020, 21:54
RE: Arduino UNO + SIM900A - przez MERASerwis - 12-03-2020, 11:31
RE: Arduino UNO + SIM900A - przez hugobossbb - 12-03-2020, 13:21
RE: Arduino UNO + SIM900A - przez MERASerwis - 12-03-2020, 14:17
RE: Arduino UNO + SIM900A - przez hugobossbb - 15-03-2020, 16:14
RE: Arduino UNO + SIM900A - przez Agregacik - 15-03-2020, 19:13
RE: Arduino UNO + SIM900A - przez hugobossbb - 18-03-2020, 15:59

Skocz do:


Przeglądający: 2 gości