تشخیص قطع برق در آردینو و انصال باطری

3 ماه قبل
112 بازدید

0

سلام. مهندس دمیرچی‌همانطور فرمودید یک سوال جدید برای مشکلم باز کردم.

از وسط تقسیم مقاومتی یک سیم به پایه ۵ آردینو وصل کردم(ولتاژ سیم متصل شده حدود ۴ ولت است) که هر وقت برق قطع میشود با پیامک اعلام کند و هر وقتم وصل میشود اعلام کند اما متاسفانه درست عمل نمیکند و بعد از برق قطع مدام ویام قطع و وصل میدهد و وقتی ام برق دوباره وصل و قطع میشود تشخیص نمیدهد در خالی که همین دستورات برای رله درست عمل میکند و چراغ را خاموش‌میکنم پیام میدهد خاموش‌شد و روشن میکنم پیام میده روسن شد، لطفا راهنمایی بفرمایید چطور این مشکل را حل کنم، برنامه را هم به پیوست ارسال کردم:

#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(7, 8);
char incomingByte;
String inputString;

int batt = 5;

#define batt 5
bool batts,
    lastbatt = 0;
#define rel1 6
bool rels1, lastrel1 = 0;
bool relc1 = 0;
String numbers[5] = {"+98*********", "+98**********"};
String ersal[5] = {"AT+CMGS=\"+98*********\"", "AT+CMGS=\"+98*********\""};
void setup()
{
    pinMode(rel1, OUTPUT);
    pinMode(batt, INPUT_PULLUP);
    digitalWrite(batt, LOW);
    Serial.begin(9600);
    gsmSerial.begin(9600);
    delay(5000);
    while (!gsmSerial.available())
    {
        gsmSerial.println("AT");
        delay(1000);

        Serial.println("Connecting...");
    }
    Serial.println("Connected!");

    gsmSerial.println("AT+CMGF=1");
    delay(1000);

    gsmSerial.println("AT+CNMI=1,2,0,0,0");

    delay(1000);
    gsmSerial.println("AT+CMGL=\"REC UNREAD\"");
    delay(25000);
    gsmSerial.println("AT+CSMP=17,167,0,0");

    delay(500);
}

void loop()
{

    if (gsmSerial.available())
    {
        inputString = "";
        delay(1000);
        while (gsmSerial.available())
        {
            incomingByte = gsmSerial.read();
            inputString += incomingByte;
        }
        delay(100);

        // inputString.replace("\n","");
        Serial.print("input : ");
        Serial.print(inputString);
        Serial.println("  end");

        inputString.toUpperCase();
        Serial.println("input up : " + inputString);
        if (inputString.indexOf("ON1") > 0)
        {
            digitalWrite(rel1, HIGH);
        }
        if (inputString.indexOf("OFF1") > 0)
        {
            digitalWrite(rel1, LOW);
        }
    }

    rels1 = digitalRead(rel1);
    if (lastrel1 != rels1)
    {
        if (rels1 == HIGH)
        {
            lastrel1 = rels1;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[i]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print("LUMP PAZIRAEI ROSHAN SHOD");

                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }
    rels1 = digitalRead(rel1);
    if (lastrel1 != rels1)
    {
        if (rels1 == LOW)
        {
            lastrel1 = rels1;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[0]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print(" LUMP PAZIRAEI KHAMOSH SHOD");
                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }
    // lkkkk
    batts = digitalRead(batt);
    if (lastbatt != batts)
    {
        if (batts == HIGH)
        {
            lastbatt = batts;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[i]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print("battery vasl shod");

                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }
    batts = digitalRead(batt);
    if (lastbatt != batts)
    {
        if (batts == LOW)
        {
            lastbatt = batts;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[0]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print("batery ghat shod");

                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }
}

بیشتر بخش های برنامه را هم با کمک گفتگوهای داخل انجمن و دوستانم نوشتم و درست کار میکنه و فقط این باطری عملکرد درستی نداره

 

ویرایش اول:

با یک تقسیم مقاومتی ۱۲ ولت رو کردم ۴ولت . وصل کردم به پایه ۵ آردینو و پایه ۵را هم با یک مقاومت وصل کردم به gnd آردینو که درحالت عادی صفر باشه، اما همانطور که فرمودید با اینکار ولتاژ ۴ولت بهم میخوره، اما به جای تقسیم مقاومتی یک کاهنده میذارم و ولتاژ ۱۲ ولت رو میکنم ۴ ولت و خروجی مثبتش رو به پایه ۵ آردینو وصل میکنم درسته اما نمیدانم در بلند مدت برای آردینو مشکل ایجاد مینه یا نه و آیا ممکنه باعث سوختن آردینو بشه؟

راهی هست که همین تقسیم مقاوتی و با وجو مقاومت پول دان اینکار رو انجام بدم که کاهنده استفاده نکنم؟

 

 

ببخشید بیرون هستم امکان کشیدن نداشتم، چون یکی از بچه های الکترونیک میخواد از کافه ربات خرید کنه گفتم کمی صبر کنه اگر قطعه ای نیاز داشتم رو خریدش خرید منم اضافه کنه که به امید خدا بتونم تاقبل عید کارش رو تمام و تست کنم و برای عید که میریم ویلا مدار رو اونجا نصب کنم و به خاطر همین با اجازتون اتصالات را نوشتم و عکس نفرستادم

 

ویرایش دوم:

پایه ها به این صورت وصل شدن:

پایه ۳ سنسور دما dht11

پایه ۴ سنسور خشکی خاک

پایه ۵ از وسط تقسیم مقاومتی یا کاهنده برای تشخیص قطع برق

پایه ۶ و ۹ و ۱۰ و ۱۱ ماژول رله چهارتایی

پایه ۷ و ۸ به tx و rx ماژول sim800

Gnd آردینو با gnd ماژول sim800 وصل شدن

پایه ۵ هم به gnd با یک مقاومت ۱۰ کیلو اهمی وصل شده

تغذیه سنسورها و رله را هم از 5ولت و gnd آردینو گرفتم

ولتاژ آداپتور(ورودی) ۱۲ ولت هست که با دو تا کاهنده به ۵ و ۴.۲ ولت برای آردینو و sim800 تبدیل شده.

 

 

 

 

 

 

 

25 بهمن 02 در 05:16
راحله
1

افزودن دیدگاه

4 پاسخ ثبت شده است
0

با سلام

در مورد کد شما چند ایرادی را می توانم بگیرم.

مورد اول: چندین بار یک چیز را تخصیص دادید که اشتباه می باشد. ( مقدار batt رو یک بار define کردید یک بار int)

مورد دوم: در زمان روشن شدن فقط کامند ها را به GSM ارسال میکنید و بررسی نمیکنید که چه جوابی برای شما بر میگردد و امکان دارد مشکل داشته باشد.

مورد سوم: در بخش

 if (lastrel1 != rels1)
    {
        if (rels1 == HIGH)
        {

و 

if (lastrel1 != rels1)
    {
        if (rels1 == LOW)
        {

کد 2 بار تکرار شده و منطقی نمی باشد که شرایط رله با قبلی عوض شده است یا خیر و در این شرایط اگر HIGH یا LOW باشد چه کاری را بکند. این را می توانید هر 2 را در یک متغیر جا بدهید.

مورد چهارم: داخل هر 2 این if ها کد را به دستور از سمت سریال مانیتور قفل کرده اید. (این مورد را به چیزی که در نهایت میخواهید ست کنید باید تنظیم کنید و به این صورت نباید نگه دارید)

همین شرایط را دوباره برای خوندن مقدار ولتاژ پایه batt دارید.

 

برای شما 2 فانکشن مدیریت پیام های ارسالی و دریافتی بین میکرو و GSM را اضافه کردم

به همراه یک فانکشن برای ارسال پیام و بررسی ارسال پیام.

در صورت امکان از پین شماره 2 برای خواندن قطع و وصل بودن منبع استفاده کنید و از مود interrupt میکرو برای این موضوع برای شما استفاده کردم.

فقط بخش batt رو به این صورت تغییر دادم و سایر بخش ها را خود شما اصلاح کنید.

#include <Arduino.h>
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(7, 8);
char incomingByte;
String inputString;

int batt = 5;

#define batt 5
bool batts,
    lastbatt = 0;
#define rel1 6
bool rels1, lastrel1 = 0;
bool relc1 = 0;
String numbers[5] = {"+98*********", "+98**********"};
String ersal[5] = {"AT+CMGS=\"+98*********\"", "AT+CMGS=\"+98*********\""};

//////////////////////////////////////////////////////////////////////////
const byte interruptPin = 2;

String serialRead(String value, String startOrEndWith, bool startOrEnd = true)
{
    int cunter = 0;
    String checker = "";
sendAgine:
    Serial.println("Send Data to GSM :" + value);
    gsmSerial.println(value);
    delay(50);
    while (true)
    {
        cunter++;
        if (gsmSerial.available())
        {
            checker = gsmSerial.readStringUntil('\n');
            checker.trim();
            Serial.println(checker);
            if (checker.startsWith("+CME ERROR: 58"))
            {
                Serial.println("Error on send line");
                goto sendAgine;
            }
            if (startOrEnd)
            {
                if (checker.startsWith(startOrEndWith))
                {
                    Serial.println("return " + checker);
                    return checker;
                }
            }
            else
            {
                if (checker.endsWith(startOrEndWith))
                {
                    Serial.println("return " + checker);
                    return checker;
                }
            }
        }
        delay(50);
        if (cunter == 250)
        {
            cunter = 0;
            gsmSerial.flush();
            goto sendAgine;
        }
    }
}

bool sendMessage(String number, String value)
{
    int cunter = 0;
    String checker = "";
sendAgin1:
    Serial.println("Message to :" + number + "\t-" + value);
    gsmSerial.flush();
    delay(10);
    gsmSerial.println("AT+CMGS=\"" + number + "\"");
    delay(5);
    while (true)
    {
        cunter++;
        if (gsmSerial.available())
        {
            checker = gsmSerial.readStringUntil('\n');
            checker.trim();
            Serial.println(checker);

            if (checker.startsWith("+CME ERROR: 58"))
            {
                Serial.println("Error on send line");
                goto sendAgin1;
            }

            if (checker.startsWith(">"))
            {
                gsmSerial.println(value);

                delay(10);
                gsmSerial.write(26);
                while (true)
                {
                    if (gsmSerial.available())
                    {
                        checker = gsmSerial.readStringUntil('\n');
                        Serial.println(checker);
                        if (checker.startsWith("OK"))
                        {
                            delay(100);
                            serialRead("AT+CMGD=1,4", "OK");
                            gsmSerial.readStringUntil('\n');
                            gsmSerial.readStringUntil('\n');
                            return true;
                        }
                        else if (checker.startsWith("+CMS ERROR: "))
                        {
                            return false;
                        }
                    }
                }
            }
        }
        Serial.print(',');
        delay(50);
        if (cunter == 500)
        {
            cunter = 0;
            goto sendAgin1;
        }
    }
}

void powerChange()
{
    batts = true;
}

void setup()
{
    pinMode(rel1, OUTPUT);
    pinMode(batt, INPUT_PULLUP);
    digitalWrite(batt, LOW);
    Serial.begin(9600);
    gsmSerial.begin(9600);
    delay(5000);
    while (!gsmSerial.available())
    {
        gsmSerial.println("AT");
        delay(1000);

        Serial.println("Connecting...");
    }
    Serial.println("Connected!");

    gsmSerial.println("AT+CMGF=1");
    delay(1000);

    gsmSerial.println("AT+CNMI=1,2,0,0,0");

    delay(1000);
    gsmSerial.println("AT+CMGL=\"REC UNREAD\"");
    delay(25000);
    gsmSerial.println("AT+CSMP=17,167,0,0");

    delay(500);

    ////////////////////////////////////////////////////////////////////////////
    pinMode(interruptPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(interruptPin), powerChange, CHANGE);
}

void loop()
{

    if (gsmSerial.available())
    {
        inputString = "";
        delay(1000);
        while (gsmSerial.available())
        {
            incomingByte = gsmSerial.read();
            inputString += incomingByte;
        }
        delay(100);

        // inputString.replace("\n","");
        Serial.print("input : ");
        Serial.print(inputString);
        Serial.println("  end");

        inputString.toUpperCase();
        Serial.println("input up : " + inputString);
        if (inputString.indexOf("ON1") > 0)
        {
            digitalWrite(rel1, HIGH);
        }
        if (inputString.indexOf("OFF1") > 0)
        {
            digitalWrite(rel1, LOW);
        }
    }

    rels1 = digitalRead(rel1);
    if (lastrel1 != rels1)
    {
        if (rels1 == HIGH)
        {
            lastrel1 = rels1;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[i]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print("LUMP PAZIRAEI ROSHAN SHOD");

                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }
    rels1 = digitalRead(rel1);
    if (lastrel1 != rels1)
    {
        if (rels1 == LOW)
        {
            lastrel1 = rels1;
            for (byte i = 0; i < 2; i++)
            {
                gsmSerial.println("AT+CMGF=1");

                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                }
                gsmSerial.println(ersal[0]);
                delay(500);
                while (Serial.available())

                {
                    gsmSerial.write(Serial.read());
                }
                while (gsmSerial.available())

                {
                    Serial.write(gsmSerial.read());
                    gsmSerial.print(" LUMP PAZIRAEI KHAMOSH SHOD");
                    delay(500);
                    while (Serial.available())

                    {
                        gsmSerial.write(Serial.read());
                    }
                    while (gsmSerial.available())

                    {
                        Serial.write(gsmSerial.read());
                    }
                    gsmSerial.write(26);
                }
                delay(5000);
            }
        }
    }

    if (batts)
    {
        if (digitalRead(interruptPin))
            sendMessage(numbers[1], "batery ghat shod");
        else
            sendMessage(numbers[1], "batery vasl shod");
        batts = false;
        attachInterrupt(digitalPinToInterrupt(interruptPin), powerChange, CHANGE);
    }

    // // lkkkk
    // batts = digitalRead(batt);
    // if (lastbatt != batts)
    // {
    //     if (batts == HIGH)
    //     {
    //         lastbatt = batts;
    //         for (byte i = 0; i < 2; i++)
    //         {
    //             gsmSerial.println("AT+CMGF=1");

    //             delay(500);
    //             while (Serial.available())

    //             {
    //                 gsmSerial.write(Serial.read());
    //             }
    //             while (gsmSerial.available())

    //             {
    //                 Serial.write(gsmSerial.read());
    //             }
    //             gsmSerial.println(ersal[i]);
    //             delay(500);
    //             while (Serial.available())

    //             {
    //                 gsmSerial.write(Serial.read());
    //             }
    //             while (gsmSerial.available())

    //             {
    //                 Serial.write(gsmSerial.read());
    //                 gsmSerial.print("battery vasl shod");

    //                 delay(500);
    //                 while (Serial.available())

    //                 {
    //                     gsmSerial.write(Serial.read());
    //                 }
    //                 while (gsmSerial.available())

    //                 {
    //                     Serial.write(gsmSerial.read());
    //                 }
    //                 gsmSerial.write(26);
    //             }
    //             delay(5000);
    //         }
    //     }
    // }
    // batts = digitalRead(batt);
    // if (lastbatt != batts)
    // {
    //     if (batts == LOW)
    //     {
    //         lastbatt = batts;
    //         for (byte i = 0; i < 2; i++)
    //         {
    //             gsmSerial.println("AT+CMGF=1");

    //             delay(500);
    //             while (Serial.available())

    //             {
    //                 gsmSerial.write(Serial.read());
    //             }
    //             while (gsmSerial.available())

    //             {
    //                 Serial.write(gsmSerial.read());
    //             }
    //             gsmSerial.println(ersal[0]);
    //             delay(500);
    //             while (Serial.available())

    //             {
    //                 gsmSerial.write(Serial.read());
    //             }
    //             while (gsmSerial.available())

    //             {
    //                 Serial.write(gsmSerial.read());
    //                 gsmSerial.print("batery ghat shod");

    //                 delay(500);
    //                 while (Serial.available())

    //                 {
    //                     gsmSerial.write(Serial.read());
    //                 }
    //                 while (gsmSerial.available())

    //                 {
    //                     Serial.write(gsmSerial.read());
    //                 }
    //                 gsmSerial.write(26);
    //             }
    //             delay(5000);
    //         }
    //     }
    // }
}
25 بهمن 02 در 06:47
محمد دمیرچی
3670

سپاسگزارم. ببخشید مهندس دمیرچی این برنامه درست کار نمیکنه، تو سریال مانییتور ارور مینویسه و مدام ,,,,,,, را ارسال میکنه و قطع هم نمیشه!  – راحله 02-11-25 در 07:10

در چه مرحله ای به این صورت می شود؟ از همون ابتدا به این حالت میرود؟؟ و چیز دیگری را تایپ نمیکند؟؟  – محمد دمیرچی 02-11-25 در 11:16

چرا موارد کانکت و ارتباط رو انجام میدهد بعد از اون اینطور میشود  – راحله 02-11-25 در 01:00

ببخشید راهی غیر از استفاده از پایه ۲ وinterrupt نیست که فقط پایه ۵ یا ۱۳ استفاده شود بدون استفاده از تابع و و از کلیات برنامه خودم استفاده کنم؟ آخه پایه ۲ پر هست به برد لحیمش‌کردم و این برنامه برای رله هم درست کار میکنه پیغام خاموش روسن شدن رله رو پیامک میکنن اما برای باطری درست عمل نمیکنه!  – راحله 02-11-25 در 01:04

دشتورات مربوط if که فرمودید در برنامه دارک برای رله مشکلی نداره و خوبی‌به وظیفش عمل میکنه اما برای باطری ایجاد مشکل میکند که دلیلش هم فکر کنم همون باشه که ناچارم پایه پنج را low تعریف کنم که high‌ یودن را تشخیص دهد  – راحله 02-11-25 در 01:06

سلام یک مقاومت ۱۰ کیلو بین پایه ۵ و gnd آردینو به عنوان پول دان گذاشتم که پایه ۵ صفر بشه اما با تقسیم مقاومتی که برای ماهش ولتاژ ۱۲ ولت به ۴ ولت برای اتصال به پایه ۵ گذاشتم کار نمرد ولی از یک ماژول کاهنده استفاده کردم و ولتاژ ۱۲ ولت رو کردم ۴ ولت و با برنامه ای که در سوال خدمتتون ارسال کردم کار کرد، یعنی تا برق قطع میشه پیام میده و وصلم میشه پیام میده، این روش باعث آسیب دیدن آردینو نمیشه؟  – راحله 02-11-26 در 05:02

افزودن دیدگاه

0

با سلام

مورد اول: 

خیر فقط پایه های 2 و 3 برای آردوینو Uno امکان قرار گیری در مود  interrupt را دارند.

مورد دوم:

خدمتتون عرض کردم از نظر نگارش کد ایراد دارد، این که کد کار کند به کار میکند ولی هرچقدر به جلو بروید بیشتر به مشکل میخورد و ایراد های بیشتری پیدا میکنید و نمیدانید از کجا می باشد.

مورد سوم:

برای استفاده از سایر پایه ها از روش های دیگری به جای اینتراپت استفاده میشود کرد، همچنین وقتی شما با مقاومت پین مربوطه را Pull_down میکنید. مقدار تقسیم مقاومتی را بهم میریزید. در زمان هایی که از تقسیم مقاومتی برای ورودی دیتا استفاده میکنید نباید از تقسیم مقاومتی استفاده کنید.

با ویرایش سوال یک نقشه کامل از نقشه سیم کشی خود قرار بدهید ببینم یه چه صورت چه چیز هایی را وصل کرده اید.

28 بهمن 02 در 06:20
محمد دمیرچی
3670

سوال ‌‌‌ویرایش شد  – راحله 02-11-28 در 08:07

منظور بنده نقشه کامل هست. تمام سنسور ها رله ها و..  – محمد دمیرچی 02-11-28 در 08:39

سوال ویرایش شد  – راحله 02-11-28 در 09:03

در مورد ایرادات برنامه حق با شماست، اما الان اولویتم اینه که تا قبل از تعطیل شدن و نزدیکی عید بحث‌سخت افزار انجام بشه و تو ایام عید به ایرادات نرم افزاری که فرمودید بپردازم و رفع کنم، این چند روزم برخی ایراداتی که گفته بودید رو رفع کردم. چون همه وقتی که این مدت گذاشتم برای این بود که بتونم عید که میریم و زمان بیشتری اونجا هستیم این مدار رو وصل کنم.  – راحله 02-11-29 در 08:44

اینکه با کاهنده ۱۲ ولت آداپتور رو بکنم ۴ ولت و به پایه ۵ وصل کنم و پایه پنج رو هم با مقاومت ۱۰ کیلو اهم به gnd وصل کنم(پول دان) مشکلی پیش نمیاد؟؟ چون gnd ها به هم وصل هستند و کلا تغذیه اصلی یکیه، وقتی پایه پنج از طریق سیمی که از مثبت کاهنده که به آن وصل شده high میشه مثبت و منفی اتصال کوتاه نمیشن و آردینو بسوزه؟؟  – راحله 02-11-30 در 02:13

مقاومت pull-down رو کلا نباید بذارید، فقط خروجی مقسم ولتاژ را باید به این طرف بیاورید، همچنینGND کل سیستم باید با هم مشترک باشن  – محمد دمیرچی 02-12-01 در 06:00

ممنون، ببخشید مقاومت پول دان چرا نباید بذارم؟ به خاطر اینکه تقسیم مقاومتی رو بهم میریزه می فرمایید یا به خاطر اینکه به برد آسیب میزنه؟ (وقتی پول دان میذارم ولتاژ رو به جای نقسیم مقاومتی با کاهنده کم میکنم)  – راحله 02-12-01 در 06:46

چون وقتی ازین روش‌استفاده میکنم(استفاده از کاهنده به جای تقسیم مقاومت و مقاومت پول اپ)مشکلم حل میشه، فقط می ترسم مدارم بسوزه یا مشکلی براش ایجاد بشه  – راحله 02-12-01 در 07:08

افزودن دیدگاه

0

با سلام

با توجه به این مدار

این کد را اصلاح کردم و به درستی کار میکند.

#include <Arduino.h>
#include <SoftwareSerial.h>
SoftwareSerial gsmSerial(7, 8);
char incomingByte;
String inputString;

int batt = 5;
bool batts = false;
#define rel1 6
bool rels1, lastrel1 = 0;
bool relc1 = 0;
String numbers[5] = {"+98*********", "+98**********"};
String ersal[5] = {"AT+CMGS=\"+98*********\"", "AT+CMGS=\"+98*********\""};

//////////////////////////////////////////////////////////////////////////
String checker = "";
String serialRead(String value, String startOrEndWith, bool startOrEnd = true)
{
    int cunter = 0;
    checker = "";
sendAgine:
    Serial.println("Send Data to GSM :" + value);
    gsmSerial.println(value);
    delay(50);
    while (true)
    {
        cunter++;
        if (gsmSerial.available())
        {
            checker = gsmSerial.readStringUntil('\n');
            checker.trim();
            Serial.println(checker);
            if (checker.startsWith("+CME ERROR: 58"))
            {
                Serial.println("Error on send line");
                goto sendAgine;
            }
            if (startOrEnd)
            {
                if (checker.startsWith(startOrEndWith))
                {
                    Serial.println("return " + checker);
                    return checker;
                }
            }
            else
            {
                if (checker.endsWith(startOrEndWith))
                {
                    Serial.println("return " + checker);
                    return checker;
                }
            }
        }
        delay(50);
        if (cunter == 250)
        {
            cunter = 0;
            gsmSerial.flush();
            goto sendAgine;
        }
    }
}

bool sendMessage(String number, String value)
{
    int cunter = 0;
    checker = "";
sendAgin1:
    Serial.println("Message to :" + number + "\t-" + value);
    gsmSerial.flush();
    delay(10);
    gsmSerial.println("AT+CMGS=\"" + number + "\"");
    delay(200);
    while (true)
    {
        cunter++;
        if (gsmSerial.available())
        {
            checker = gsmSerial.readStringUntil('\n');
            checker.trim();
            Serial.println(checker);

            if (checker.startsWith("+CME ERROR: 58"))
            {
                Serial.println("Error on send line");
                goto sendAgin1;
            }
            if (checker.startsWith(">"))
            {
                gsmSerial.println(value);

                delay(10);
                gsmSerial.write(26);
                while (true)
                {
                    if (gsmSerial.available())
                    {
                        checker = gsmSerial.readStringUntil('\n');
                        Serial.println(checker);
                        if (checker.startsWith("OK"))
                        {
                            delay(100);
                            serialRead("AT+CMGD=1,4", "OK");
                            gsmSerial.readStringUntil('\n');
                            gsmSerial.readStringUntil('\n');
                            return true;
                        }
                        else if (checker.startsWith("+CMS ERROR: "))
                        {
                            return false;
                        }
                    }
                }
            }
        }
        Serial.print(',');
        delay(50);
        if (cunter == 500)
        {
            cunter = 0;
            goto sendAgin1;
        }
    }
}

void setup()
{
    pinMode(rel1, OUTPUT);
    pinMode(batt, INPUT);
    pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(115200);
    gsmSerial.begin(9600);

    delay(1000);
    gsmSerial.println("AT");
    while (true)
    {
        while (gsmSerial.available())
        {
            checker = gsmSerial.readStringUntil('\n');
            checker.trim();
            Serial.println(checker);

            if (checker.startsWith("RDY"))
            {
                Serial.println("GSM booting");
            }
            else if (checker.startsWith("+CREG:"))
            {
                checker.remove(0, checker.indexOf(',') + 1); //+CREG: 0,1
                Serial.println(checker);
                if (checker.startsWith("1"))
                {
                    Serial.println("Boot done");
                    goto BOOT;
                }
            }
        }
        Serial.print('.');
        gsmSerial.println("AT+CREG?");
        delay(1000);
    }
BOOT:
    serialRead("AT+CMGF=1", "OK");
    serialRead("AT+CNMI=1,2,0,0,0", "OK");
    // serialRead("AT+CSMP=17,167,0,0","OK");

    delay(500);
}

void loop()
{

    if (digitalRead(batt) != batts)
    {
        Serial.println(digitalRead(batt));
        Serial.println(batts);

        if (digitalRead(batt))
        {
            sendMessage("+989----------", "batery ghat shod");
            Serial.println("Active");
            digitalWrite(LED_BUILTIN, HIGH);
            batts = true;
            delay(1000);
        }
        else
        {
            sendMessage("+989----------", "batery vasl shod");
            Serial.println("Deactive");
            digitalWrite(LED_BUILTIN, LOW);
            batts = false;
            delay(1000);
        }
    }
    delay(100);
}

تست کردم و ارسال پیام نیز به درستی انجام می شود.

مشکل اصلی سری پیش کد بنده در این بود که بر اساس ESP32 نوشته شده بود و با سرعت بالا شروع به ارسال داده میکرده.

در حالی که آردوینو به شدت کند تر عمل میکند و نمیتوانست با دستور ها همراه بشود.

سایر بخش های کد را نیز پاک کردم. بررسی کنید و اعلام کنید چه مشکلی برای شما پیش آمد.

در صورت مشکل حتما از متن هایی که در سریال مانیتور برای شما ارسال می شود را در اینجا قرار بدهید.

 

 

01 اسفند 02 در 02:38
محمد دمیرچی
3670

خیلی خیلی ممنونم، چشم، تست میکنم نتیجه رو خدمتتون عرض میکنم.  – راحله 02-12-01 در 03:45

ببخشید آقای مهندس ازین برنامه می توانم برای ویلمک قعا یا غیرفعال سازی رله ها هم استفاده کنم یا برای این کار تغییرات زیادی نیاز داره؟  – راحله 02-12-01 در 08:20

نقدا همین را تست کنید. درصورتی که جواب گرفتید اطلاع بدهید تا ببینم مابقی سیستم را میخواهید چکار کنید.  – محمد دمیرچی 02-12-02 در 04:25

از این همه توجه و وقتی که میگذارید صمیمانه سپاسگزارم، چشم در اولین فرصت تست میکنم و نتیجه رو خدمتتون عرض میکنم  – راحله 02-12-02 در 05:37

ببخشید مهندس دمیرچی لطفا در مورد بحث اینکه به جای تقسیم مقاومتی از کاهنده استفاده بشه توضیح بفرمایید، البته ان شاالله با راهنمایی و برنامه ای که زحمت کشیدید این مورد حل میشه اما پر کل برام ابهام شده که اگر از مقاومت پول دان و ورودی ۵ ولتی که از کاهنده اومده و به پایه ای که پول دان شده استفاده کنیم برای برد مشکلی پیش میاد و‌ میسوزه؟؟ یکی ازبچه های برق میگفت آردینو میسوزه اما من در مورد پول دان و پول آپ خیلی تو اینترنت خوندم و برداشتم اینه که مشکلی ایجاد نمیشه و اون مقاومت مانع ایجاد مشکل میشه، ممنون میشم در این مورد نظرتون رو بفرمایید.  – راحله 02-12-02 در 11:45

افزودن دیدگاه

0

در مورد استفاده از ماژول کاهنده، این یک کار احمقانه تلقی میشه. چون با 2 عدد مقاومت که تقسیم مقاومتی را می توان ایجاد کرد برای چی هزینه اضافی بشود برای ماژول کاهنده.

همچنین در ماژول های کاهنده باتوجه به خسلتی که دارن در صورتی که از این سویچینگ ها استفاده می کنید، در زمان روشن شدن یک پالس ولتاژ بالاتر در لحظه روشن شدن و خاموش شدن ایجاد می شود که در اکثر میکروکنترلر ها در سمت تغذیه مشکلی ایجاد نمیکند ولی در پایه ها امکان دارد حساسیت بیشتری نشون بدن. (این مورد دقیقا یک بار باعث سوختن میکرو بنده شد به صورتی که برای تغذیه از یک ماژول کاهنده استفاده کرده بودم که 3.3 ولت را ایجاد کند و ورودی نیز از یک باتری لیتومی استفاده کرده بودم ، مشکل جایی ایجاد شد که ولتاژ باتری به 3.9 ولت رسید و خروجی این ماژول کاهنده شد 7 ولت و زد کلی از قطعات رو سوزوند)

تقسیم مقاومت نیز یک مقدار مشخص هست

وقتی خروجی تقسیم مقاومت را دوباره با یک مقاومت pull-up یا pull-down میکنید. طبق اصل ساده سازی مقاومت ها، این مقاومت دوباره با مقاومت مقسم مقاومتی موازی می شود و طبق قانون اهم به مقدار جدید میرسید.
که مقدار تقسیم مقاومتی را بهم میریزد و ولتاژ نهایی که به پایه میرسد اشتباه می شود و باعث خطا های بیشتری می شود.

در صورتی که میخواهید بر روی ولتاژ های فیکس خاصی کار کنید می توانید از دیود زنر به جای مقاومتی که به سمت زمین در تقسیم مقاومتی میرود استفاده کنید و یک رگوراتور خطی کوچیک ایجاد کنید.

تمام این موارد pull-up و pull-down با توجه به این که در کجا استفاده میشن و با چه اهمی استفاده میشن مهم هستش. در 90 درصد جا ها خوبه استفاده بشه و باید استفاده بشه و بعضی جا ها اصلا نباید استفاده بشه، برای مثال بر روی لاین های سریال و SPI نباید استفاده کنید چون نویز میندازد ولی بر روی لاین I2C پیشنهاد میشود استفاده بشود.

اهم های مورد استفاده نیز بنده همیشه پیشنهاد میدهم برای این مقاومت ها از مقدار های بالای 10 کیلو استفاده بشود، چون جریان کشی ندارد و مشکلی در سیستم ایجاد نمیکنند و باعث سوختگی نمیشوند. اهم های پایین تر از 300 اهم امکان دارد بسته به نوع ولتاژ ها مشکل ایجاد کنند.

در مورد این پروژه شما نیز یک ویدیو تست هم گرفته بودم قرار دادم.

بنده دم دستی از مقاومت های 330k و 100k استفاده کردم که بعد از تقسیم مقاومتی باید عدد 2.8 را به بنده میدادن که با توجه به ویدیو همین عدد را حدودا دارم (البته تغذیه روی 12.5 بود)

ویرایش اول

دیود زنر هم روش مطمئن تری هست (البته باید مقاومت درستی را همراهش قرار بدهید چون در صورت عدم قرار دهی مقاومت درست باعث آسیب دیدن دیود زنر می شود و همین سوختن باعث میشود ولتاژ ورودی به پین آردوینو به صورت مستقیم وصل بشود)

برای مثال می توانید به این سایت برای محاسبه مراجعه کنید.

و با فرض ورودی 13 ولت و خروجی 5 ولت و جریان کشی 1 میلی آمپری پیشنهاد میدهد که از 8 کیلو استفاده کنید

که میتوانید از یک مقاومت 10 کیلو برای این منظور استفاده کنید

02 اسفند 02 در 01:04
محمد دمیرچی
3670

بابت ویدیو و توضیحات مفصلتون بسیار ممنونم، پس با توضیحات شما می توان نتیجه گرفت که سوختن آردینو در صورت استفاده از کاهنده وجود داره.  – راحله 02-12-02 در 02:45

ببخشید مهندس دمیرچی، این روش دیود زنر که فرمودید روش قابل اطمینانیه؟ یا مانند کاهنده ممکن است ایجاد مشکل کند؟  – راحله 02-12-03 در 08:03

پاسخ ویرایش شد  – محمد دمیرچی 02-12-05 در 07:05

ممنون، من یک دیود زنر ۴.۱ ولت از یکی‌گرفتم با مقاومت ۸.۲ کیلو خروجیش میشه ۳.۷ ولت اما براساس سایتی که شما معرفی کردید برای ۳.۷ ولت مقاومتش باید ۹.۴کیلو باشه، دلیل این اختلاف چیه؟  – راحله 02-12-05 در 09:43

برنامه ی شما هم اگر پایه پنج رو پول دان نکنم موقع قطع برق مدام پیام باطری وصل شد باطری قطع شد ارسال میکنه  – راحله 02-12-05 در 10:44

این برنامه رو به صورت مجزا بررسی کردم، جایی از سیستم شما دچار مشکل هست که این سطح ولتاژ را تشخیص نمیدهد. احتمال دارد سیم GND را به درستی وصل نکرده اید. پیشنهاد میکنم برنامه AnalogtoSerial را بر روی برد خود آپلود کنید و به جای پایه 5 پین مورد نظر را به پایه A0 وصل کنید و بررسی کنید آیا نوسان دارد یا خیر. (می توانید با سریال پلاتر این موضوع را بررسی کنید.  – محمد دمیرچی 02-12-05 در 01:21

ممنون، بله حتما بررسی میکنم ان شاالله  – راحله 02-12-07 در 06:12

سلام جناب مهندس دمیرچی با راهنمایی شما برنامم رو اصلاح کردم و خیلی بهتر و منظم و کوتاه شد، صمیمانه از شما تشکر میکنم.  – راحله 02-12-09 در 06:08

در مورد پایه که high رو تشخیص نمیده من کلا دو تا آردینو یونو دارم که باش دو تا مدار برای خودمون درست کردم، هردوش رو جدا تست کردم و فقط به کامپیوتر وصل کردم و هیچی دیگه بشون وصل نبود، همینکه هر پایه رو تعریف میکنم و برنامه رو آپلود میکنم اون پایه که تعریف شده پایش چهار ولت و خورده ای یعنی high میشه  – راحله 02-12-09 در 06:11

در تمامی سیستم ها حد ولتاژ وسط ولتاژ بیشترین هست (برای مثال در آردوینو حداکثر وقتی 5 ولت می باشد هر عددی بالای 2.5 ولت میشود HIGH).  – محمد دمیرچی 02-12-12 در 05:55

افزودن دیدگاه


انجمن کافه‌ربات © 1400