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