Нужна помощь в объяснении кода для школьного проекта.

Antifreeze
Offline
Зарегистрирован: 09.07.2020

Я школьник, у меня есть проект который я должен выполнить на Arduino. В принципе все готово но мне не понятно пару моментов по коду. ЗА небольшое вознаграждение если кто может помогите пожалуйста. У меня управление реле через SMS, вопрос такой, почему в мониторе порта, после отправки СМС проскакивает 2 раза

SMS send started

SMS send complete

AT+CMGS="+7"
 
> Heater - ON
SMS send started
SMS send complete
 
И очень долго отправляется ответная смс, в первом варианте у меня при отсылке СМС начинали валится ответные без остановки, но они отправлялись очень быстро. И для чего нужно ((char)26)) в функции отправки СМС.
#include <SoftwareSerial.h>
#define PIN_RELAY 5
SoftwareSerial mySerial(4, 3);
char incomingByte; 
String inputString;
int otpr;
void setup() {
  pinMode(PIN_RELAY, OUTPUT);
  digitalWrite(PIN_RELAY, HIGH);
  Serial.begin(57600);
  mySerial.begin(57600);
  while(!mySerial.available()){
    mySerial.println("AT");
    delay(1000);         
    Serial.println("Connecting…");
    }
    Serial.println("Connected!");
    mySerial.println("AT+CMGF=1");
    delay(1000);
    //mySerial.println("AT+IPR=57600");
    //delay(1000);   
    mySerial.println("AT+CNMI=1,2,0,0,0");
    delay(1000);
    mySerial.println("AT+CMGL=\"REC UNREAD\"");
}

void loop() 
{
  otpr = 0;
  if(mySerial.available())
  {
   delay(100);
    while(mySerial.available())
    {      
    incomingByte = mySerial.read();
    inputString += incomingByte;
    }
    delay(10);
    Serial.println(inputString);
    inputString.toUpperCase();
    if (inputString.indexOf("ON") > -1 && otpr == 0)
          {
           otpr == 1;
           digitalWrite(PIN_RELAY, LOW);
           sms(String("Heater - ON"), String("+7"));
          }
          delay (50);
           
       if (inputString.indexOf("OFF") > -1 && otpr == 0)
          {
           otpr == 1;
           digitalWrite(PIN_RELAY, HIGH);
           sms(String("Heater - OFF"), String("+7"));
          }
           delay(50);
           
        if (inputString.indexOf("OK") == -1)
        {    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(200);
        }     
        inputString = "";
      }
 }

 void sms(String text, String phone) 
 {
   Serial.println("SMS send started");
   mySerial.println("AT+CMGS=\"" + phone + "\"");
   delay(200);
   mySerial.print(text);
   delay(200);
   mySerial.print((char)26);
   delay(200);
   Serial.println("SMS send complete");
   delay(200);
 }

 

b707
Offline
Зарегистрирован: 26.05.2017

в строчках 43 и 51 ошибка

Antifreeze
Offline
Зарегистрирован: 09.07.2020

Мне сказали сделать переменную, чтобы при отправке она менялась и соответственно не повторялась отправка СМС до бесконечности

b707
Offline
Зарегистрирован: 26.05.2017

Антифриз, давайте начистоту - вы этот код писали сами или где-то нашли готовый и ничерта не понимаете? Я Вам написал точные номера строк, где у вас ошибка, там в каждой строке буквально по пять символов. Если вы не видите там ошибку - значит вы язык программирования не знаете совсем. так?

b707
Offline
Зарегистрирован: 26.05.2017

короче. исправьте "==" на "=" в этих строчках

Antifreeze
Offline
Зарегистрирован: 09.07.2020

b707 пишет:

Антифриз, давайте начистоту - вы этот код писали сами или где-то нашли готовый и ничерта не понимаете? Я Вам написал точные номера строк, где у вас ошибка, так в каждой строке буквально по пять символов. Если вы не видите там ошибку - значит вы язык программирования не знаете совсем. так?

Я же написал что учусь в школе, делаю проект. Брал код готовый, делал под себя, но у меня по факту отправлял СМС с ответом до бесконечности, чтобы отправлял только 1 раз мне сказали сделать переменную, присвоить ей 0, после отправки сделать ее единичкой. Я и прошу помощи, потому как не все понимаю. Если поменять на = то ничего не меняется.

b707
Offline
Зарегистрирован: 26.05.2017

Antifreeze пишет:

мне сказали сделать переменную, присвоить ей 0, после отправки сделать ее единичкой.

вы не спорьте, а слушайте. Конструкция otpr == 1; не присваивает переменной единичку, то есть не делает то, что вам сказали.

Antifreeze
Offline
Зарегистрирован: 09.07.2020

Я уже понял что == используется в условии, но одинарный знак = не помогает в решении проблемы.

b707
Offline
Зарегистрирован: 26.05.2017

еще строчку otpr = 0; со строки 29 переставьте между строкой 62 и 63

b707
Offline
Зарегистрирован: 26.05.2017

и строчку 73 поменять на mySerial.write(26);

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

А если три === поставить?

inspiritus
Offline
Зарегистрирован: 17.12.2012

И кстати антифриз! Пришедши к незнакомым людям в компанию и желая от них что то поиметь, неплохо было бы здравия пожелать присутствующим. Особенно если ты школьник пришел к взрослым дядям за помощью.

а во-вторых напиши ка к каждой строке комментарии, которые исчерпывающе описывают что именно эта каждая строка должна делать по-твоему.

ведь ты же просил объяснений, а не исправлений ?