Sim900, сдвиговый регистр, питание. Вопросы новичка.
- Войдите на сайт для отправки комментариев
Делаю контроллер полива на 8 теплиц, все уже почти готово но имеется несколько проблем, главная из которых под номером 3 - ответное смс. потому и в этот раздел поместил...
1. Есть девять реле восемь из которых управляются через сдвиговый регистр 74НС595, и закономерно получаю дребезг во время включения дуины. ПРобовал реализовать схему где на резет регистра через минус подсоединен конденсатор 0.1 микрофарада и он же подтянут сопротивлением на плюс. Вроде по идее должен во время подачи энергии подаваться минус через конденсатор но либо этого не происходит либо длительность сигнала маленькая либо что еще. Эта схема вообще должна работать?
Выходов свободных нет, такчто нужен какойнить апаратный сброс. Впринципе можно и забить, ибо реле насоса управлется через обычный выход дуины. Но както не красиво выходит.
2. Имеется жсм шилд, програмное включение которого осуществляется через 8 пин. может есть способ отказаться от такого способа, например кнопку запаять или еще что, чтобы 8й пин освободить для залочивания ОЕ выхода регистра, для решения проблемы номер 1?
3 и самый главный вопрос. Никак не могу найти способ считывания номера приславшего смс и отправки ему ответного сообщения. Если ктонить поделится кодом буду очень благодарен! или ссылочку где это реализованно. Управление шилдом осуществляю через ат команды без всяких там библиотек. Вот как то так(код урезал убрав лишнее) :
Понимаю что выход ноль и один используются по умолчанию, но у меня без библиотеки не получалось запустить, хотя может плохо пробовал.
#include <SoftwareSerial.h> #include <Wire.h> SoftwareSerial gprsSerial(0, 1); int greenPin = 2; //для отладки int yellowPin = 3; int CXEMA_poliva = 0; //переменная для выбора схемы полива int klp_1=1; // переменные для теплиц(клапанов), будет 8 но пока 4 int klp_2=0; //эта теплица типа выключена, остальные вкл int klp_3=1; int klp_4=1; int chas_poliva=16; //чтобы сообщать время последнего полива int minuta_poliva=45; //формирую смс с информацией о состоянии системы void sendTextMessage() { gprsSerial.print("AT+CMGF=1\r"); delay(100); gprsSerial.println("AT + CMGS = \"+79099999999\""); //номер на который смс отправляется, вот его и нужно менять delay(100); //печатаем включеные теплицы: 1 - включена, 0 выключена gprsSerial.print("Teplica:"); gprsSerial.print(klp_1);gprsSerial.print(","); gprsSerial.print(klp_2);gprsSerial.print(","); gprsSerial.print(klp_3);gprsSerial.print(","); gprsSerial.println(klp_4); gprsSerial.print("Cxema:"); gprsSerial.println(CXEMA_poliva); //печатаем схему поливу gprsSerial.print("Poliv:"); //печатаем время последнего полива gprsSerial.print(chas_poliva); gprsSerial.print(":"); gprsSerial.println(minuta_poliva); delay(100); gprsSerial.println((char)26); } void setup() { //жсм вкл pinMode(8, OUTPUT); digitalWrite(8, HIGH); delay(3000); digitalWrite(8, LOW); delay(5000); pinMode(8, INPUT); //хз зачем но пусть будет gprsSerial.begin(19200); pinMode(greenPin, OUTPUT); pinMode(yellowPin, OUTPUT); gprsSerial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения delay(300); gprsSerial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты. delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); // хз что это но видимо надо) delay(500); gprsSerial.print("AT+CMGD=1,4\r");//все удалить delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Cxema 1")) { //прислали смс "схема 1" поменяли схему. CXEMA_poliva =1; } else if (!currStr.compareTo("Cxema 2")) { CXEMA_poliva =2; } else if (!currStr.compareTo("Cxema 0")) { CXEMA_poliva =0; } else if (!currStr.compareTo("Status")) { //запрос состояния систеемы, вопрошающему нужно отправить смс, в данном же коде смс отправляется заранее определенному лицу, что не удобно. sendTextMessage(); //отправляем адресату } else if (!currStr.compareTo("Bal")) { gprsSerial.print("ATD#105#;\r"); // делаем запрос баланса (мтс), кстати это уже теле2 и как не пробовал все по русски баланс приходит. проверка не срабатывает, исправимо? } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } if(currStr.startsWith("+CUSD")) // этот блок отлавливает ответ на запрос баланса и отправляет его смской { currStr = currStr.substring(currStr.indexOf("Balance"),currStr.indexOf("r")); delay(2000); gprsSerial.println("AT + CMGS = \"+790926666666\""); // тут тоже можно номер менять, ну или вообще забить на проверку! delay(100); gprsSerial.println(currStr); delay(100); gprsSerial.println((char)26); delay(100); } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } if (CXEMA_poliva ==1) {digitalWrite(greenPin, HIGH);digitalWrite(yellowPin, LOW); } //зажигаем диоды в зависимости от выбранной схемы if (CXEMA_poliva ==2) {digitalWrite(yellowPin, HIGH);digitalWrite(greenPin, LOW);} if (CXEMA_poliva ==0) {digitalWrite(greenPin, LOW);digitalWrite(yellowPin, LOW); } }
4. Проекте включает: Ардуино уно китайская подделка под италию, символьный лсд экран 16х2, жсм шилд, датчик температуры dht 22, 9 реле (одновременно включаться будут по 2шт), часы 2321 вроде или что то типа того. Для жсм производитель говорит надо не меньше 9в и 2а, а значит хочу приобрести блок питания, вроде ничо не забыл. Внимание вопрос!
Подойдет ли этот блок питания впринципе? Нужно ли питать модули реле отдельно, тоесть еще один блок питания на 5 вольт для них? подойдет ли данное реле для включения насоса, поидее у насоса 4,5а, а на реле 10а написанно, но это же китай так что вопрос) включаться будет не на долго секунд на 10-20 раз в 15 мин примерно, и если питать отдельно то землю релюшек в ардуино или в блок питания или туда и туда?
зы. програмирую я методом научного плагиата, язык знаю крайне скудно, в схемотехнике тоже примерно так же, прошу учитывать) вроде ниччего не забыл.
Рекомендую все строки во флеш перенести (F(строка)). Кучу памяти освободишь. Номера для SMS можно в EEPROM засунуть, чтобы каждый раз при смене номера не прошивать контроллер.
Дык покури вывод в Serial при входящем сообщении. Там по идее и должен быть нужный номер.
БП лучше купи в местном магазине. Китайцы обычно лютую хрень шлют. Я очень сомневаюсь, что модуль столько жрет. :)
Вроде умещается скетч но все равно если можешь дай мне ссыль на тему переноса во флешь? или как запрос поисковый задать подскажи.
Дело в том что я вообще не хочу в память телефоны записывать, хочу чтобы можно было управлять с любого, а для этого надо считать номер приславшего смс и ответное смс отсылать ему. Вот как это осуществить я пока ответа не нашел, а искал долго.
Там есть он, просто чтобы я смог реализовать у себя нужен работующий пример. Видимо надо делать проверку по типу: если строка начинается с +7 значит это номер телефона, помещаем его в переменную и вставляем в получатели ответного смс. Так то вроде несложно звучит, но реализовать с нуля - знаний нехватает.
Да а чо, в местном магазине та же китайщина)) Тем более что в местном магазе на 9 вольт и хотяб 2 ампера я не видел. Есть вариант конечно универсальный для ноута купить но это на крайняк а то дорого. Везде пишут что надо 9 вольт и 2 ампера причем выделяют это отдельно. От ноутбучного, вроде 2х амперного, выхода по юсб проводу мощей нехватает, и по тому же проводу и от 1а зарядки тоже.
Вот нашел
AT+CNMI=1,2,2,1,0 - включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате:
+CMT: "<номер телефона>", "", "<дата, время>", а на следующей строчке с первого символа идёт содержимое сообщения
у меня собстна так и получается, осталось както взять отсюда номер..
1. Есть девять реле восемь из которых управляются через сдвиговый регистр 74НС595, и закономерно получаю дребезг во время включения дуины. ПРобовал реализовать схему где на резет регистра через минус подсоединен конденсатор 0.1 микрофарада и он же подтянут сопротивлением на плюс. Вроде по идее должен во время подачи энергии подаваться минус через конденсатор но либо этого не происходит либо длительность сигнала маленькая либо что еще. Эта схема вообще должна работать?
Я так понимаю что при включении устройства релюхи хаотично включаются и выключаются пока ардуино не инициализирует 74HC545?
Если так то выход один - замена 74HC595 на PCF8574 у которой нет такого недостатка (ардуино здесь не причем)
Хмм, интересная штука, пойду курить инфу. Спасибо!
Могу скинуть инфу, скажи куда
Лови
Все получил, спасибо!
Вот это же оно?
тыц
Конечно оно...
http://ru.aliexpress.com/item/LCD-2004-IIC-I2C-Interface-adapter-plate-LCD1602-2004/1353322528.html
http://ru.aliexpress.com/item/New-PCF8574T-PCF8574-SOP16-wide-parallel-port-extender/32368480264.html