Управление отоплением в загородном доме (GSM)

Тема в разделе "Глядите, что я сделал", создана пользователем Вячеслав, 6 дек 2012.

  1. ИгорьК

    ИгорьК Гуру

    Улыбает непадецки. :)
    Где-то есть ссылка на необходимость этого действа? И вообще - что дает ДАТЧИКУ неслушание его цифрового выхода.
     
  2. Aleks_NN

    Aleks_NN Нерд

    http://digitalchip.ru/datchik-dvizheniya-pir-motion-sensor-hc-sr501
    Тут достаточно внятное описание этих датчиков. Вообще он самодостаточен, переписывать скетч стоит, только в случае, если логику распознавания случайных и неслучайных срабатываний, планируется возложить на контролер. Соответственно, вначале, надо придумать этот алгоритм распознавания.
    Один раз я использовал подобный датчик, и при подключении питания, он выдавал единичку на выход, и лишь затем включал ноль и включался в рабочий режим. А это значит, что требуется пауза на считывание этого датчика при перезагрузке дуни.
     
  3. ИгорьК

    ИгорьК Гуру

    Не исключено, но вряд ли стоит называть это патетически "инициализация и калибровка датчика" - сильно в заблуждение вводит.
     
  4. Luk-men

    Luk-men Нуб

    Очень интересная идея! Скетч переделал для своих нужд, но почему то возникают ошибки компиляции. Не могу понять в чем проблема,начальный скетч компилируется без проблем

    [
    Сергей\Desktop\end_home_control\end_home_control.ino: In function 'void GetDatchik()':

    end_home_control:89: error: 'sendTextMessage' was not declared in this scope

    C:\Users\Сергей\Desktop\end_home_control\end_home_control.ino: In function 'void loop()':

    end_home_control:127: error: 'ParseSMS' was not declared in this scope

    end_home_control:151: error: 'sendTextMessage' was not declared in this scope

    end_home_control:171: error: 'ParseSMS' was not declared in this scope

    end_home_control:194: error: 'sendTextMessage' was not declared in this scope

    end_home_control:216: error: 'sendTextMessage' was not declared in this scope

    end_home_control:224: error: a function-definition is not allowed here before '{' token

    end_home_control:294: error: expected '}' at end of input

    end_home_control:294: error: expected '}' at end of input

    exit status 1
    'sendTextMessage' was not declared in this scope

    ]
    [
    #include <SoftwareSerial.h>
    #include "DHT.h"
    #define DHTPIN 7 // pin на котором висит датчик температуры
    #define DHTTYPE DHT11 // DHT 22 тип датчика
    //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
    int powerGSM = 6; //Пин включения GSM
    int unit1 = 8; //Управляемое устройство 1
    int unit2 = 9; //Управляемое устройство 2
    int perimetr = 12;// Датчик периметра
    int voda = 4; //датчик уровня воды
    String statusHome;
    int t=0;

    unsigned long currentTime;
    unsigned long loopTime;

    boolean unit1status = false; //Управляемое устройство 1
    boolean unit2status = false; //Управляемое устройство 2
    boolean isvoda = false;//датчик уровня воды


    boolean isPerimetr = false; //Контроль периметра
    boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
    boolean isAuto = false; //Автоматическое управление температурой
    int autoTemp = 0;
    int delta=2;

    DHT dht(DHTPIN, DHTTYPE);

    SoftwareSerial gprsSerial(2, 3);

    boolean prevBtn = LOW;
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;

    void setup()
    {
    pinMode(unit1, OUTPUT);
    pinMode(unit2, OUTPUT);
    pinMode(voda, INPUT);
    pinMode(powerGSM, OUTPUT);
    pinMode(perimetr, INPUT);

    digitalWrite(unit1, HIGH);
    digitalWrite(unit2, HIGH);
    digitalWrite(powerGSM, LOW);

    //Включаю GSM Модуль
    digitalWrite(powerGSM, HIGH);
    delay(5000);
    gprsSerial.begin(19200);
    delay(300);
    // Настраиваем приём сообщений с других устройств
    // Между командами даём время на их обработку
    gprsSerial.print("AT+CMGF=1\r");
    delay(300);
    gprsSerial.print("AT+IFC=1, 1\r");
    delay(300);
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    delay(300);
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
    delay(500);

    //Инициализация температурного датчика
    Serial.begin(9600);
    Serial.println("DHTxx test!");

    dht.begin();
    delay(3000);
    // ParseSMS("1;20;0;1;1;1;1");
    currentTime = millis();
    loopTime = currentTime;
    }



    void GetDatchik() {
    // Пол
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    // check if returns are valid, if they are NaN (not a number) then something went wrong!
    if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
    } else {
    statusHome = int(h)+String(";")+int(t)+String(";")+digitalRead(voda)+String(";")+int(isvoda)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
    sendTextMessage(statusHome);
    // Serial.print("H"); //Влажность
    // Serial.print(h);
    // Serial.print(";");
    // Serial.print("T"); //Температура
    // Serial.print(t);
    // Serial.println(";");
    // Serial.println(statusHome);

    }
    }






    void loop()
    {
    // delay(5000);
    // GetDatchik();
    int sostPerimetr; //Состояние периметра
    if (gprsSerial.available()){
    char currSymb = gprsSerial.read();
    // Serial.print(currSymb);

    // return;
    // char currSymb = gprsSerial.read();
    // Serial.println(currSymb);
    if ('\r' == currSymb) {
    if (isStringMessage) {
    //если текущая строка - SMS-сообщение,
    //отреагируем на него соответствующим образом
    if (!currStr.compareTo("STATUS"))
    {
    GetDatchik();
    }
    else if (currStr.startsWith("0")||currStr.startsWith("1")) {
    ParseSMS(currStr);
    }

    isStringMessage = false;
    } else {
    if (currStr.startsWith("+CMT")) {
    //если текущая строка начинается с "+CMT",
    //то следующая строка является сообщением
    isStringMessage = true;
    }
    }
    currStr = "";
    } else if ('\n' != currSymb) {
    currStr += String(currSymb);
    }
    }
    // Контроль периметра!!!
    if (isPerimetr==true) { //Проверка Включен ли контроль периметра
    sostPerimetr = digitalRead(perimetr);
    if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
    digitalWrite(unit1, LOW);
    delay(200);
    //и отсылаем СМС
    if (sendSMS==false){
    sendTextMessage("WARNING! The perimeter of the broken!");

    sendSMS=true;
    }
    }

    }
    int sosvoda; //Состояние воды
    if (gprsSerial.available()){
    char currSymb = gprsSerial.read();
    // Serial.print(currSymb);
    if ('\a' == currSymb) {
    if (isStringMessage) {
    //если текущая строка - SMS-сообщение,
    //отреагируем на него соответствующим образом
    if (!currStr.compareTo("STATUS"))
    {
    GetDatchik();
    }
    else if (currStr.startsWith("0")||currStr.startsWith("1")) {
    ParseSMS(currStr);
    }

    isStringMessage = false;
    } else {
    if (currStr.startsWith("+CMT")) {
    //если текущая строка начинается с "+CMT",
    //то следующая строка является сообщением
    isStringMessage = true;
    }
    }
    currStr = "";
    } else if ('\b' != currSymb) {
    currStr += String(currSymb);
    }
    }
    // Контроль воды!!!
    if (isvoda==true) { //Проверка Включен ли контроль воды
    sosvoda = digitalRead(voda);
    if (sosvoda==LOW) { //Проверка на разомкнутый воды
    delay(200);
    //и отсылаем СМС
    if (sendSMS==false){
    sendTextMessage("WARNING!VODA!");

    sendSMS=true;
    }
    }

    }
    // Контроль температуры!!!
    if (isAuto==true) { //Проверка Включен автоуправление батареями
    //Замер температуры можно проводить не чаще раз в 5 минут
    currentTime = millis();
    if(currentTime >= (loopTime + 60000)){
    t = int(dht.readTemperature());
    loopTime = currentTime;
    }
    //
    // Serial.print("t=");
    // Serial.println(t);
    // Serial.print("autoTemp+delta=");
    // Serial.println(autoTemp+delta);
    if (t < autoTemp-delta) {
    if (sendSMS==false){
    sendTextMessage("WARNING! TEMPERATURE!");
    sendSMS=true;
    }
    }




    void ParseSMS(String currStr) {
    int firstSemicolon;
    //Распарсиваем SMS
    firstSemicolon = 1;//находим первую ;
    //Получаем значение Автоматического режима контроля температуры
    // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
    if (currStr.substring(0,1) == "0"){
    isAuto=false;
    }
    else{
    isAuto=true;
    }
    // Serial.println(currStr.substring(0,1));
    // Serial.print("isAuto=");
    // Serial.println(isAuto);
    firstSemicolon = currStr.indexOf(';');
    //Получаем значение Автоматического уровня температуры
    autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    // Serial.println(autoTemp);
    //Получаем значение Контроля периметра
    if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
    isPerimetr=false;
    } else {
    isPerimetr=true;
    }
    // Serial.println(isPerimetr);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    //кОНТРОЛЬ ВОДЫ
    if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
    isvoda=false;
    } else {
    isvoda=true;
    }
    // Serial.println(isvoda);
    firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );





    }

    /*
    * Функция отправки SMS-сообщения
    */
    void sendTextMessage(String text) {
    // Устанавливает текстовый режим для SMS-сообщений
    gprsSerial.print("AT+CMGF=1\r");
    delay(100); // даём время на усваивание команды
    // Устанавливаем адресата: телефонный номер в международном формате
    gprsSerial.println("AT + CMGS = \"+7909939XXXX\""); //Телефон нужно откорректировать
    delay(100);
    // Пишем текст сообщения
    gprsSerial.println(text);
    delay(100);
    // Отправляем Ctrl+Z, обозначая, что сообщение готово
    gprsSerial.println((char)26);
    }


    //Функция преобразовангия STRING в INT
    int stringToNumber(String thisString) {
    int i, value = 0, length;
    length = thisString.length();
    for(i=0; i<length; i++) {
    value = (10*value) + thisString.charAt(i)-(int) '0';;
    }
    return value;
    }
    }
    ]
     
  5. Aleks_NN

    Aleks_NN Нерд

    Наверное, все дело в орфографии и пунктуации. Компилятор не согласен с отсутствием знаков препинания. :)) Следите за ";" и проверяйте скобки "{ ... }" на парность.
     
  6. Luk-men

    Luk-men Нуб

    Спасибо за ответ. Исправил ошибки со скобками, вылезли новые.
    Код (C++):
    #include <SoftwareSerial.h>
    #include "DHT.h"
    #define DHTPIN 7    // pin на котором висит датчик температуры
    #define DHTTYPE DHT11  // DHT 22 тип датчика
    //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
    int powerGSM = 6; //Пин включения GSM
    int unit1 = 8; //Управляемое устройство 1
    int unit2 = 9; //Управляемое устройство 2
    int perimetr = 12;// Датчик периметра
    int voda = 4; //датчик уровня воды
    String statusHome;
    int t=0;
    unsigned long currentTime;
    unsigned long loopTime;
    boolean unit1status = false; //Управляемое устройство 1
    boolean unit2status = false; //Управляемое устройство 2
    boolean isvoda = false;//датчик уровня воды

    boolean isPerimetr = false; //Контроль периметра
    boolean sendSMS = false; //Для проверки что смс отсылаем только один раз
    boolean isAuto = false; //Автоматическое управление температурой
    int autoTemp = 0;
    int delta=2;
    DHT dht(DHTPIN, DHTTYPE);
    SoftwareSerial gprsSerial(2, 3);
    boolean prevBtn = LOW;
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void setup()
    {
        pinMode(unit1, OUTPUT);
        pinMode(unit2, OUTPUT);
        pinMode(voda, INPUT);
        pinMode(powerGSM, OUTPUT);
        pinMode(perimetr, INPUT);
        digitalWrite(unit1, HIGH);
        digitalWrite(unit2, HIGH);
        digitalWrite(powerGSM, LOW);
        //Включаю GSM Модуль
        digitalWrite(powerGSM, HIGH);
        delay(5000);
        gprsSerial.begin(19200);
        delay(300);
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
        //Инициализация температурного датчика
        Serial.begin(9600);
        Serial.println("DHTxx test!");
        dht.begin();
        delay(3000);
    // ParseSMS("1;20;0;1;1;1;1");
      currentTime = millis();
      loopTime = currentTime;
    }
    void GetDatchik() {
      // Пол
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      // check if returns are valid, if they are NaN (not a number) then something went wrong!
      if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
      } else {
        statusHome = int(h)+String(";")+int(t)+String(";")+digitalRead(voda)+String(";")+int(isvoda)+String(";")+int(isPerimetr)+String(";")+digitalRead(perimetr)+String(";")+int(isAuto)+String(";")+int(autoTemp)+String(";STEWARD");
        sendTextMessage(statusHome);
    //  Serial.print("H"); //Влажность
    //  Serial.print(h);
    //  Serial.print(";");
    //  Serial.print("T"); //Температура
    //  Serial.print(t);
    //  Serial.println(";");
    //  Serial.println(statusHome);
      }
    }
    void loop()
    {
    // delay(5000);
    // GetDatchik();
    int sostPerimetr; //Состояние периметра
      if (gprsSerial.available()){
      char currSymb = gprsSerial.read();
    // Serial.print(currSymb);
          //  return;
      //  char currSymb = gprsSerial.read();
      //  Serial.println(currSymb);
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("STATUS"))
                {
                  GetDatchik();
                }
                else if (currStr.startsWith("0")||currStr.startsWith("1")) {
                  ParseSMS(currStr);
                }
           
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
      }
    //  Контроль периметра!!!
      if (isPerimetr==true) { //Проверка Включен ли контроль периметра
          sostPerimetr = digitalRead(perimetr);
            if (sostPerimetr==LOW) { //Проверка на разомкнутый периметр
              digitalWrite(unit1, LOW);
              delay(200);
              //и отсылаем СМС
              if (sendSMS==false){
                sendTextMessage("WARNING! The perimeter of the broken!");
               
                sendSMS=true;
              }
          }
      }
      int sosvoda; //Состояние воды
      if (gprsSerial.available()){
      char currSymb = gprsSerial.read();
    // Serial.print(currSymb);
        if ('\a' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("STATUS"))
                {
                  GetDatchik();
                }
                else if (currStr.startsWith("0")||currStr.startsWith("1")) {
                  ParseSMS(currStr);
                }
           
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\b' != currSymb) {
            currStr += String(currSymb);
        }
      }
    //  Контроль воды!!!
      if (isvoda==true) { //Проверка Включен ли контроль воды
          sosvoda = digitalRead(voda);
            if (sosvoda==LOW) { //Проверка на разомкнутый воды
              delay(200);
              //и отсылаем СМС
              if (sendSMS==false){
                sendTextMessage("WARNING!VODA!");
                sendSMS=true;
              }
          }
      }
    //  Контроль температуры!!!
      if (isAuto==true) { //Проверка Включен автоуправление батареями
      //Замер температуры можно проводить не чаще раз в 5 минут
          currentTime = millis();
      if(currentTime >= (loopTime + 60000)){
      t = int(dht.readTemperature());
      loopTime = currentTime;
      }
    //
    //  Serial.print("t=");
    //  Serial.println(t);
    //  Serial.print("autoTemp+delta=");
    //  Serial.println(autoTemp+delta);
        if (t < autoTemp-delta) {
         if (sendSMS==false){
                sendTextMessage("WARNING! TEMPERATURE!");
                sendSMS=true;  
         }
       }
      }
    }
    void ParseSMS(String currStr) {
      int firstSemicolon;
      //Распарсиваем SMS
      firstSemicolon = 1;//находим первую ;
      //Получаем значение Автоматического режима контроля температуры
      // if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        if (currStr.substring(0,1) == "0"){
        isAuto=false;
      }
        else{
          isAuto=true;
        }
      //  Serial.println(currStr.substring(0,1));
    //  Serial.print("isAuto=");
    //  Serial.println(isAuto);
      firstSemicolon = currStr.indexOf(';');
      //Получаем значение Автоматического уровня температуры
      autoTemp = stringToNumber(currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )));
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    // Serial.println(autoTemp);
      //Получаем значение Контроля периметра
      if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        isPerimetr=false;
      } else {
          isPerimetr=true;
        }
    //  Serial.println(isPerimetr);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
      //кОНТРОЛЬ ВОДЫ
       if (currStr.substring(firstSemicolon+1,currStr.indexOf(';', firstSemicolon + 1 )) == "0"){
        isvoda=false;
      } else {
          isvoda=true;
        }
    //  Serial.println(isvoda);
      firstSemicolon = currStr.indexOf(';',firstSemicolon + 1 );
    }
     
    /*
    * Функция отправки SMS-сообщения
    */

    void sendTextMessage(String text) {
        // Устанавливает текстовый режим для SMS-сообщений
        gprsSerial.print("AT+CMGF=1\r");
        delay(100); // даём время на усваивание команды
        // Устанавливаем адресата: телефонный номер в международном формате
        gprsSerial.println("AT + CMGS = \"+7909939XXXX\""); //Телефон нужно откорректировать
        delay(100);
        // Пишем текст сообщения
        gprsSerial.println(text);
        delay(100);
        // Отправляем Ctrl+Z, обозначая, что сообщение готово
        gprsSerial.println((char)26);
    //Функция преобразовангия STRING в INT
    int stringToNumber(String thisString) {
      int i, value = 0, length;
      length = thisString.length();
      for(i=0; i<length; i++)
        {
        value = (10*value) + thisString.charAt(i)-(int) '0';
        }
      return value;
    }
    }
     
    C:\Users\Сергей\Desktop\end_home_control\end_home_control.ino: In function 'void ParseSMS(String)':

    end_home_control:242: error: 'stringToNumber' was not declared in this scope

    C:\Users\Сергей\Desktop\end_home_control\end_home_control.ino: In function 'void sendTextMessage(String)':

    end_home_control:279: error: a function-definition is not allowed here before '{' token

    end_home_control:288: error: expected '}' at end of input

    exit status 1
    'stringToNumber' was not declared in this scope


     
  7. Aleks_NN

    Aleks_NN Нерд

    Нет закрывающей скобки в: void sendTextMessage(String text)
    и лишняя скобка в конце скетча.

    ЗЫ. Это вам не сочинение на тему "Война миров" писать. У компилятора запятую не отспоришь :)

    И уберите кириллицу из названия скетча. Оп, это не название, это путь к каталогу. Все равно не хорошо, сделайте каталог для проектов в корне диска, кириллица в виндовых путях - моветон.
     
    Последнее редактирование: 26 ноя 2016
  8. mastert

    mastert Нуб

    Всем привет. Воспользовался проектом valdai, с этой темы, все работает стабильно. Единственное напрягает при каждом запуске приложения появляется вот это предупреждение, кто знает что это такое и как убрать? Screenshot_2016-11-29-15-46-04.jpg SmartSelectImage_2016-11-29-15-33-12.png
     
    Последнее редактирование: 29 ноя 2016
  9. vovka1021

    vovka1021 Нерд

    Это он ругается на отсутствии резервного питания. Подключить + на пин(см. В скече #пина)
     
    mastert нравится это.
  10. kadr142

    kadr142 Нуб

    Всем привет! Помогите пожалуйста новичку... Как правильно соединить вот такие платы между собой? Нужно ли корректировать скетч опубликованный в начале темы?
     

    Вложения:

  11. saha1950

    saha1950 Нуб

    Добрый день. Очень понравились Ваши проекты. У меня есть UNOR3, LcdkeypadShield, датчики DH11, GSM модем. Если не пойдет модем докуплю какой нужно.

    Я не силен в программировании. Не могли бы Вы дать мне скетчи работающие (без ошибок) и андроидные программы бля пробы.

    Мой мейл altim1950@mail.ru
     
  12. vovka1021

    vovka1021 Нерд

    Если хочешь могу такой вариант предложить, он рабочий, но требуется доработка кода в плане стабильности работы Screenshot_20161210-153656.png
     
    andros нравится это.
  13. vist

    vist Нуб

    Добрый день! Будьте добры cбросьте исходники на ist-2010@mail.ru. Спасибо.
     
  14. saha1950

    saha1950 Нуб

    Я только хочу начать т.ч. Все пойдет главное рабочий скетч для ардуина
     
  15. Здравствуйте,подскажите пожалуйста.у меня такая проблема,стоял стевард(который из начала темы)на телефоне с андроидом версии 4.2,и прекрасно работал,но тут пришлось поменять телефон,а там версия андроида 5.1,и после установки и запуска стеварда пишет"произошла ошибка",скажите что можно сделать,может кто сталкивался,стевард 2,как писали выше мне не подойдет,потому что там не один датчик,а у меня один,да мне и не нужно больше,а при отсутствии датчиков никакой управляемости(отсылки и получении смс) не будет.Короче цель такова,как сделать,чтобы старый мною уважаемый стевард запускался на новом телефоне с андроидом 5.1
     
  16. YanTV

    YanTV Нерд

    Сконвертируй исходники своего стеварда в App Invertor 2
     
  17. YanTV

    YanTV Нерд

    Не могли бы вы скинуть исходники своего проекта yantv@yandex.ru Я так понял что информация о балансе у вас не реализована?
     
  18. Aleks_NN

    Aleks_NN Нерд

    "Информация о балансе" - это, в первую очередь, функция расшифровки ответа ОПСОСа. В каждом, отдельно взятом случае, надо применять те алгоритмы, которые уместны в вашем регионе у вашего оператора. И это ваша работа :)) Если не умеете, то - учитесь. Как завещал...
     
  19. vovka1021

    vovka1021 Нерд

    Инфо о балансе реализовано по отдельному запросу, но она мне не нужна. Без неё как то даже лучше. Все равно тариф безлимитный. Чуть позже спину как доберусь до компа
     
  20. saha1950

    saha1950 Нуб

    Хочу хоть Что нибудь рабочее