Сонар не запускается после отключения питания

Viktor1306
Viktor1306 аватар
Offline
Зарегистрирован: 19.05.2016

Делаю один проект. В нём, среди прочего, должен определятся процент заполнение контейнера. Градации такие пустой, 25%, 50%, 75% и полный. Результат должен передаваться по GPRS на сервер, где он сохраняется в БД MSSQL. Проблема в том, что модуль должен работать от аккумулятора, и работать долго, порядка от 6 месяцев до года. Размеры аккумулятора ограничены. Я использовал 2 штуки по 8000 А.ч. Для того чтоб их хватило, я придумал такой алгоритм работы устройства. В режиме ожидания (а это основной режим устройства) питание идёт только на ATMega на плате Arduino pro mini. При чём напряжение питания понижается до 1,8v. Для работы микропрограммы этого в полне хватает. При таком напряжении контроллер потребляет всего 0,03 mA, что сопоставимо с потреблением эл. часов и пультов ДУ. Раз в 6 часов должен включаться сонар, и если объём не изменился, то ни чего не происходит. А если изменился, то включаестя GSM шилд, передаёт данные и отключается снова. Помимо сонара там установлены датчики, пожарный, геркон и гироскоп. Так вот, Все датчики работают нормально. А вот сонар, при включении 1 раз передаёт реальное расстояние, а после того, как контроллер отключит его и снова включит. Он начинает определять чушь, то 0см, то 3см. Необходимо полностью перезагрузить всю схему чтоб он заработал. Подскажите что я не так делаю. По теории всё должно работать. Для обработки сигналов от сонара использовал как библиотеку Ультрасоник так и код в ручную писал - результат один. Не пойму где зарыта собака, ведь в принципе какая разница, что я его отключаю вместе с контроллером, или один сонар? В первом случае всё нормально, а во втором беда.

 

fixedip
Offline
Зарегистрирован: 16.03.2015

Было-бы проще разобратся, если бы вы показали код.

 

Viktor1306
Viktor1306 аватар
Offline
Зарегистрирован: 19.05.2016

Пожалуйста код:

#include <Ultrasonic.h>
#include <SoftwareSerial.h>

Ultrasonic ultrasonic(13,12); //trig, echo
SoftwareSerial GSMport(7, 8); // RX, TX

//Константы настроек, после вынести в EPROM
const String contno ="470000000001"; 
const String serv = "95.188.79.100";
const String arnoper ="internet.tele2.ru"; 
const String usroper = "tele2";
const String pwdoper = "tele2";


unsigned long currentTime;
unsigned long loopTime;
const int sbPin = 4; //Режим Standby
const int powPin = 5; //Включение GSM модуля
const int coverPin = 10; //Датчик крышки контейнера
String loc;
int bcovState = 0;
bool sb = false;
int bt;
String cson;
int t;
int ct;
bool cs = false;
String dtn;
bool bl;
bool al;
bool qw;
bool aw;
bool cw;
String er;

void setup(){
  bt = 0;
  t = 0;
  ct = 0;
  cson = "";
  bl = false;
  al = false;
  qw = false;
  cw = false;
  aw = false;
  Serial.begin(9600);
  pinMode(sbPin, OUTPUT);
  pinMode(powPin, OUTPUT);
  pinMode(coverPin, INPUT);
  digitalWrite(powPin, LOW); 
  digitalWrite(sbPin, HIGH);
  currentTime = millis(); // считываем время, прошедшее с момента запуска программы для сонара
  loopTime = currentTime;
  GSMport.begin(9600);
  Serial.println("SYSTEM ON");
}

String sonar(){
 int us = 0; 
 String uz = "";
 for (int i = 0; i < 10; i++){
  us = us + ultrasonic.Ranging(CM);
  delay(2000);
 }
 us = us/10;
 if (us < 25 && us > 0){uz = "05";}
 if (us < 49 && us > 24){uz = "04";}
 if (us < 73 && us > 48){uz = "03";}
 if (us < 96 && us > 72){uz = "02";}
 if (us < 120 && us > 96){uz = "01";}
 if (us > 120){uz = "00";}
return uz;
} 

void gprs_init() {  //Процедура начальной инициализации GSM модуля
  int d = 500;
  int ATsCount = 7;
  loc = "";
  al = true;
  Serial.println("BEGIN"); 
  digitalWrite(powPin, HIGH); //Включаем GSM модуль
  delay(15000); //Ждём, пока найдётся сеть.
  String ATs[] = {  //массив АТ команд
    "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",  //Установка настроек подключения
    "AT+SAPBR=3,1,\"APN\",\"" + arnoper + "\"",
    "AT+SAPBR=3,1,\"USER\",\"" + usroper + "\"",
    "AT+SAPBR=3,1,\"PWD\",\"" + pwdoper + "\"",
    "AT+SAPBR=1,1",  //Устанавливаем GPRS соединение
    "AT+HTTPINIT",  //Инициализация http сервиса
    "AT+HTTPPARA=\"CID\",1"  //Установка CID параметра для http сессии
  };
  int ATsDelays[] = {6, 1, 1, 1, 3, 3, 1}; //массив задержек
  Serial.println("GPRG init start");
  for (int i = 0; i < ATsCount; i++) {
    Serial.println(ATs[i]);  //посылаем в монитор порта
    GSMport.println(ATs[i]);  //посылаем в GSM модуль
    delay(d * ATsDelays[i]);
    Serial.println(ReadGSM());  //показываем ответ от GSM модуля
    
  }
  Serial.println("GPRG init complete");
  Serial.println("localisation");
  GSMport.println("AT+CIPGSMLOC=1,1");
  delay(d * 10);
  loc = ReadGSM().substring(32, 75);
  Serial.println(loc);
  delay(3000);
 }
 
void gprs_send(String data) {
  //Процедура отправки данных на сервер
  er = data;
  int d = 400;
  Serial.println("Send start");
  Serial.println("setup url");
  GSMport.println("AT+HTTPPARA=\"URL\",\"http://" + serv + "/GPRS.php?a=" + contno + "x" + data + "&l=" + loc +"&b=" + String(analogRead(0)) + "\"");
  delay(d * 2);
  Serial.println(ReadGSM());
  delay(d);
  Serial.println("GET url");
  GSMport.println("AT+HTTPACTION=0");
  delay(d * 2);
  Serial.println(ReadGSM());
  delay(d);
  al = false;
  Serial.println("Send done");
} 

void repeat(String data){
delay(30000);
gprs_init();
gprs_send(data);
}

String ReadGSM() {  //функция чтения данных от GSM модуля
  int c;
  String v;
  while (GSMport.available()) {  //сохраняем входную строку в переменную v
    c = GSMport.read();
    v += char(c);
    delay(10);
  }
  return v;
   if (v == "ERROR"){
    repeat(er); 
   }
}
  

void loop()
{
 if (bl == false){ 
  bcovState = digitalRead(coverPin); // Датчик крышки
     if (bcovState == HIGH){ //Закрыто
       if (cs == true){
           cs = false;
           delay(5);           
       }
     } else { //Открыто
       if (cs == false){
           cs = true;
           delay(5);
           bt++;
           if (bt > 3){ //Тревога
             if (qw == false){
                qw = true;
                Serial.println("ALARM");
             }
          }
       }
     } 
  currentTime = millis();    // считываем время, прошедшее с момента запуска программы (основной счётчик времени)
  if(currentTime >= (loopTime + 3000)){    // сравниваем текущий таймер с переменной loopTime + 30 сек. 
    loopTime = currentTime;
     bt = 0;
     if (analogRead(0) < 350){ //Аккумулятор разряжен
        bl = true;
        digitalWrite(sbPin, LOW); 
        gprs_init();
        gprs_send("15");
        GSMport.println("AT+SAPBR=0,1");
        delay(1500);
        digitalWrite(powPin, LOW);
        digitalWrite(sbPin, HIGH); 
     } else {
       if (qw == false){
          if (t < 600){t++;} else { //Проверка заполнения контейнера
             t = 0;
             digitalWrite(sbPin, LOW);
             Serial.println("SONAR");
             delay(1000);   
             dtn = sonar();
             Serial.println(dtn);
             if (dtn != cson){ //Проверяем изменился ли объём
               delay(1000);
               gprs_init();
               gprs_send(dtn);
                  cson = dtn;

             }
             GSMport.println("AT+SAPBR=0,1");
             delay(3000);
             digitalWrite(powPin, LOW);
             digitalWrite(sbPin, HIGH);
           }
       }
     if (qw == true){
        if (aw == false){
         aw = true; 
         digitalWrite(sbPin, LOW); 
         gprs_init();
         gprs_send("20");
         GSMport.println("AT+SAPBR=0,1");
         delay(1500);
         digitalWrite(powPin, LOW);
         digitalWrite(sbPin, HIGH);
         qw = false; 
         aw = false; 
        }
     } else {
         if (cs == true){ //Повтор крышка с задержкой 3 сек.
            if (cw == false){
               cw = true;
               Serial.println("OPEN");
               digitalWrite(sbPin, LOW); 
               gprs_init();
               gprs_send("19");
               GSMport.println("AT+SAPBR=0,1");
               delay(1500);
               digitalWrite(powPin, LOW);
               digitalWrite(sbPin, HIGH);
            } 
         } else {
            if (cw == true){
               cw = false;
               Serial.println("CLOSE");
               digitalWrite(sbPin, LOW);
               Serial.println("SONAR");
               delay(1000);   
               dtn = sonar();
               Serial.println(dtn);
               delay(1000);
               gprs_init();
               gprs_send(dtn);
               cson = dtn;
             GSMport.println("AT+SAPBR=0,1");
             delay(3000);
             digitalWrite(powPin, LOW);
             digitalWrite(sbPin, HIGH);
            }   
         }
     }
   } 
  }
 }
}

 

А это PHP скрипт который установлен на сервере:

<?php
include("setting.php");
$ip = $_SERVER['REMOTE_ADDR']; 
$today = date("Y.m.d H:i:s"); 
$param = $_REQUEST['a'];
$loc = $_REQUEST['l'];
$bat = $_REQUEST['b'];
//$bat = $bat - 600;
$exp = explode('x',$param);
$exploc = explode(',',$loc);
if(substr($param, 0, 3) == '470'){
$uid = mysql_connect($host,$user,$pass);
mysql_select_db ($db,$uid); 
mysql_query("INSERT INTO conteiners (cip,cnum,cevent,cdt,loclo,locla,bat) VALUES ('$ip','$exp[0]','$exp[1]','$today','$exploc[1]','$exploc[2]','$bat')");
mysql_close($uid);
}
?>

Если нужны электронные схемы, тоже выложу