اطلاعیه

Collapse
No announcement yet.

مشکل عدم اجرای شرط های IF در آردوینو پس از چند بار اجرا

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل عدم اجرای شرط های IF در آردوینو پس از چند بار اجرا

    سلام

    یک برنامه خیلی ساده رو از اینترنت گرفتم که از طریق sim800l تعریف شده اگر پیامک D1 اومد یک رله رو فعال و بعد از 1000 میلی ثانیه غیرفعال کنه تا درب باز بشه

    برنامه کار میکنه اما بعد از چند بار استفاده هر پیامکی که واسش ارسال بشه درب رو باز میکنه

    ;کد برنامه :

    [FONT=Yekan]#include <SoftwareSerial.h>[/FONT]#include <EEPROM.h>


    int addr = 0;


    SoftwareSerial SIM(8, 7);


    const byte PIN_RLY1 = A2;


    const byte YELLOW = A0;
    const byte RED = A1;
    const byte BUZZER = A3;
    const byte GREEN = A4;


    const byte PIN_LED = 13;


    int _timeout;
    String _buffer;
    int ledState = LOW;
    const long interval = 500;
    unsigned long previousMillis = 0;


    void setup()
    {
    Serial.begin(9600);

    Serial.println("Start ...");


    SIM.begin(9600);
    _buffer.reserve(255);


    pinMode(PIN_RLY1, OUTPUT);
    pinMode(PIN_LED, OUTPUT);
    pinMode(YELLOW, OUTPUT);
    pinMode(RED, OUTPUT);
    pinMode(BUZZER, OUTPUT);
    pinMode(GREEN, OUTPUT);


    digitalWrite(PIN_RLY1, LOW);
    digitalWrite(YELLOW, LOW);
    digitalWrite(RED, LOW);
    digitalWrite(BUZZER, LOW);
    digitalWrite(GREEN, LOW);
    digitalWrite(PIN_LED, HIGH);


    digitalWrite(RED, HIGH);
    delay(500);
    digitalWrite(RED, LOW);


    Serial.println("30 Seconds Delay");
    delay(3000);


    digitalWrite(YELLOW, HIGH);
    delay(500);
    digitalWrite(YELLOW, LOW);


    SerialOk();
    Serial.println("Serial Ok");


    GsmOk();
    Serial.println("GSM Ok");


    BasicSettings();
    Serial.println("Basic Setting Ok");


    DelAllSms();
    Serial.println("All SMS Removed Success");


    digitalWrite(PIN_LED, LOW);


    digitalWrite(BUZZER, HIGH);
    delay(500);
    digitalWrite(BUZZER, LOW);


    digitalWrite(GREEN, HIGH);
    delay(1000);
    digitalWrite(GREEN, LOW);
    }


    void loop()
    {
    if (SIM.available())
    {
    _buffer = SIM.readString();


    if (_buffer.indexOf("+") != -1)
    {
    digitalWrite(YELLOW, HIGH);
    delay(1000);
    digitalWrite(YELLOW, LOW);

    _buffer = "";
    RxdSms();
    }


    _buffer = "";

    digitalWrite(GREEN, HIGH);
    delay(500);
    digitalWrite(GREEN, LOW);
    }


    unsigned long currentMillis = millis();


    if (currentMillis - previousMillis >= interval)
    {
    previousMillis = currentMillis;


    if (ledState == LOW)
    {
    ledState = HIGH;
    } else {
    ledState = LOW;
    }


    digitalWrite(PIN_LED, ledState);
    }
    }


    void SerialOk()
    {
    while (_readSerial("AT").indexOf("OK") == -1) {
    delay(1000);
    }
    }


    void GsmOk()
    {
    while (_readSerial("AT+CGREG?").indexOf("+CGREG: 0,1") == -1) {
    delay(1000);
    }
    }


    void BasicSettings()
    {
    while (_readSerial("ATE0").indexOf("OK") == -1) {
    delay(1000);
    }
    while (_readSerial("AT+CMGF=1").indexOf("OK") == -1) {
    delay(1000);
    }
    while (_readSerial("AT+MORING=1").indexOf("OK") == -1) {
    delay(1000);
    }
    while (_readSerial("AT+CSMP=17,167,0,0").indexOf("OK") == -1) {
    delay(1000);
    }
    }


    void DelAllSms() {
    while (_readSerial("AT+CMGDA=\"DEL ALL\"").indexOf("OK") == -1) {
    delay(1000);
    }
    }


    void RxdSms()
    {
    _readSerial("AT+CMGR=1");


    digitalWrite(PIN_LED, HIGH);


    //Serial.println(get_mobile(_buffer));
    //Serial.println(get_message(_buffer));


    if (_buffer.indexOf("D1") != -1)
    {
    if (get_mobile(_buffer) == "930xxxxxxx" || get_mobile(_buffer) == "930xxxxxxx" || get_mobile(_buffer) == "930xxxxxxx")
    {
    digitalWrite(BUZZER, HIGH);
    delay(500);
    digitalWrite(BUZZER, LOW);


    delay(500);


    digitalWrite(PIN_RLY1, HIGH);
    delay(1000);
    digitalWrite(PIN_RLY1, LOW);


    delay(500);

    send_sms("Dar Baz Shod", get_mobile(_buffer));

    delay(1000);

    digitalWrite(GREEN, HIGH);
    delay(500);
    digitalWrite(GREEN, LOW);

    _buffer = "XxXxXxXxXxXxXxXxXxXx";
    } else {
    digitalWrite(BUZZER, HIGH);
    digitalWrite(RED, HIGH);
    delay(1500);
    digitalWrite(BUZZER, LOW);
    digitalWrite(RED, LOW);
    }
    }


    DelAllSms();
    digitalWrite(PIN_LED, LOW);
    ledState = LOW;
    _buffer = "XxXxXxXxXxXxXxXxXxXx";
    }


    String _readSerial(String _print)
    {
    SIM.flush();


    if (SIM.readString() != "")
    {
    while (SIM.readString() != "") {
    }
    }


    _buffer = "";


    if (_print != "")
    {
    SIM.println (_print);
    _timeout = 0;


    while (!SIM.available() && _timeout < 12000 )
    {
    delay(1);
    _timeout++;
    }


    if (SIM.available())
    {
    _buffer = SIM.readString();
    }
    }


    return _buffer;
    }


    String get_mobile(String textBuffer)
    {
    String mobile = midString(textBuffer ,"\",\"+98", "\",");


    return mobile;
    }


    String get_message(String textBuffer)
    {
    String first_line = midString(_buffer ,"+CMGR", "\n");
    String msg = midString(_buffer ,"+CMGR"+ first_line +"", "OK");
    msg.trim();


    return msg;
    }


    String midString(String str, String start, String finish)
    {
    int locStart = str.indexOf(start);

    if (locStart==-1) return "";


    locStart += start.length();


    int locFinish = str.indexOf(finish, locStart);


    if (locFinish==-1) return "";


    return str.substring(locStart, locFinish);
    }


    void send_sms(String message, String mobile)
    {
    SIM.println("AT+CMGF=1"); // Configuring TEXT mode
    updateSerial();
    SIM.println("AT+CMGS=\"+98"+ mobile +"\"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
    updateSerial();
    SIM.print(message); //text content
    updateSerial();
    SIM.write(26);
    }


    void updateSerial()
    {
    delay(500);


    while (Serial.available())
    {
    SIM.write(Serial.read());//Forward what Serial received to Software Serial Port
    }


    while(SIM.available())
    {
    Serial.write(SIM.read());//Forward what Software Serial received to Serial Port
    }
    [FONT=Yekan]}[/FONT]


    رله و LED ها به پین های آنالوگ متصل شدن و یک پایه هم به منفی متصل شده

    #2
    پاسخ : مشکل عدم اجرای شرط های IF در آردوینو پس از چند بار اجرا

    سلام،
    وقتی که این اتفاق میفته، قبل خط ۱۹۹، متغیر بافر رو چک کردید که داخلش چی هست؟

    من قبلا از کتابخونه زیر استفاده کرده بودم و به نظرم مشکلی نداشت. برای sim800l هم استفاده کرده بودم.
    library for GPRS shield with sim900 module. Contribute to Seeed-Studio/GPRS_SIM900 development by creating an account on GitHub.

    دیدگاه

    لطفا صبر کنید...
    X