Аналоговый пин
- Войдите на сайт для отправки комментариев
Пт, 05/06/2020 - 01:18
Привет всем.
Возникла неожиданная проблема.
int AR = analogRead(0);
Эта строка не позволяет выполнять функцию, котороя стоит после нее.
sendSMS("___________", "Privet");
......................
Как бы странно не звучало после считывания информации с аналогового пина, даже если к нему ничего не подключено. Мешает выполняться именно этой функции SMS. Остальные работает нормально кроме нее.
Но она рабочая. То есть как только я коментирую строку int AR = analogRead(0); Смс работает. В коде после этой строки стоит if, который даже не выполняется. Вот сама функция sms.
void sendSMS(String phone, String message)
{
SIM800.begin(9600);
sendATCommand("AT", true);
_response = sendATCommand("AT+CMGF=1;&W", true);
sendATCommand("AT+CMGS=\"" + phone + "\"", true);
sendATCommand(message + "\r\n" + (String)((char)26), true);
SIM800.end();
}
String sendATCommand(String cmd, bool waiting) {
String _resp = "";
Serial.println(cmd);
SIM800.println(cmd);
if (waiting) {
_resp = waitResponse();
Serial.println(_resp);
}
return _resp;
}
String waitResponse() {
String _resp = "";
long _timeout = millis() + 10000;
while (!SIM800.available() && millis() < _timeout) {};
if (SIM800.available()) {
_resp = SIM800.readString();
}
else {
Serial.println("Timeout...");
}
return _resp;
}
Спасибо.
А что аналогового вы хотите найти на пине 0 ???
Приведите минимально возможный скетч который демонстрирует проблему, но который можно скомпилировать. По тем кускам что вы запостили ничего особо не понятно.
А что аналогового вы хотите найти на пине 0 ???
analogRead(0) == analogRead(A0) == analogRead(14)
analogRead(0) == analogRead(A0) == analogRead(14)
сравниваете? :)
vlad257 - память?
сравниваете? :)
Намекаю.)
Думаю этого будет достаточно
функцию key_pad не добавляю поскольку, if даже не выполняеться.
Мешает конкретно зчитывание с аналогово пина.
analogRead(0) значит analogRead(A0)
Я менял на другие пины. но ничего.
конретно мешает.
int BV = analogRead(0); //button check
VR myVR(2,3); - распознавание голоса. Но оно идет позже. Если есть вопросы - отвечу сразу. Спасибо.
#include <OneWire.h> #include <SoftwareSerial.h> #include "VoiceRecognitionV3.h" #include <DFPlayer_Mini_Mp3.h> SoftwareSerial SIM800(5, 6); VR myVR(2,3); // voice recognition uint8_t records[7]; // save record uint8_t buf[64]; int ledyellow = 11; int ledblue = 8; int ledred = 9; int pirmove = 10; //sensormove int z = 0; int m = 0; char pass[4] = {'1', '2', '3', '4'}; //keypad char buttons[4]={'0', '0', '0', '0'}; int k=0; int b=0; #define on (0) //voice comand #define off (1) #define tm (2) int ret; int p; //temperature OneWire ds(13); String _response = ""; void setup() { myVR.begin(9600); Serial.begin (9600); pinMode(ledblue, OUTPUT); pinMode(ledred, OUTPUT); pinMode(ledyellow, OUTPUT); pinMode(pirmove, INPUT); //move mp3_set_serial (Serial); // mp3 delay(100); mp3_set_volume(15); } void loop() { int z=0; c: digitalWrite(ledred, LOW); digitalWrite(ledyellow, LOW); int BV = analogRead(0); //button check if (BV>10){ key_pad(); } int pirvalue = digitalRead(pirmove); if(pirvalue == HIGH || z >= 2) { //1:if 1 time move digitalWrite(ledblue, LOW); delay(1000); z=z+1; if(pirvalue == HIGH || z >= 2){ //2: if 2 times move digitalWrite(ledred, HIGH); myVR.end(); sendSMS("+____", "Secutiry active"); myVR.begin(9600); mp3_play (4); // remove protection delay(1200); //send sms about move do { mp3_play (5); //buzzer delay(1000); int BV = analogRead(0); //button ckeck if (BV>50){ key_pad(); } } while (m<100); } else { //2: goto c; } } else if (pirvalue == LOW) { //1: digitalWrite(ledblue, HIGH); delay(2000); z = 0; int BV = analogRead(1); if(BV>50){ key_pad(); z=2; } goto c; } } void sendSMS(String phone, String message) { SIM800.begin(9600); sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)! sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z SIM800.end(); } String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ Serial.println(_resp); // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема }Думаю этого будет достаточно
И совершенно напрасно так думаете. Если бы Вы знали, чего достаточно, а чего - нет, Вы бы сами всё сделали и этого поста бы не было.
Вам ведь ясно написали:
Приведите минимально возможный скетч который демонстрирует проблему, но который можно скомпилировать.
То, что Вы выложили - не компилируется. Я не могу запустить его и увидеть проблему. Что мне делать? Дополнять своими функциями-заглушками? Или не запуская сидеть и исследовать? А не слишком ли много суеты и усилий для решения чужой проблемы?
Если Вам реально нужна быстрая помощь, то не поленитесь сделать следующее:
1. Подготовит минимальный скетч, который компилируется, работает и демонстрирует проблему. Минимальный - это значит выбросьте всё, что можно выбросить так, чтобы проблема сохранялась - всё! Чем скетч будет меньше, тем лучше, тем больше вероятность, что кто-то не поленится в нём разбираться.
2. Выложите этот скетч сюда и толково объясните как воспроизвести проблему.
Ну, а если Вам лень это делать или, Вы там что-то другое "думаете", то решайте свою проблему самостоятельно.
Извиняюсь.
Это должно компилировать.
myVR.end(); sendSMS("+380973545446", "Secutiry active"); myVR.begin(9600);Код работает так:
Считивание с клавиатуры.
если кнопка нажата - горит лампа.
#include <OneWire.h> #include <SoftwareSerial.h> #include "VoiceRecognitionV3.h" #include <DFPlayer_Mini_Mp3.h> SoftwareSerial SIM800(5, 6); VR myVR(2,3); // voice recognition uint8_t records[7]; // save record uint8_t buf[64]; int ledyellow = 11; int ledblue = 8; int ledred = 9; int pirmove = 10; //sensormove int z = 0; int m = 0; char pass[4] = {'1', '2', '3', '4'}; //keypad char buttons[4]={'0', '0', '0', '0'}; int k=0; int b=0; #define on (0) //voice comand #define off (1) #define tm (2) int ret; int p; //temperature OneWire ds(13); String _response = ""; void setup() { myVR.begin(9600); Serial.begin (9600); pinMode(ledblue, OUTPUT); pinMode(ledred, OUTPUT); pinMode(ledyellow, OUTPUT); pinMode(pirmove, INPUT); //move mp3_set_serial (Serial); // mp3 delay(100); mp3_set_volume(15); } void loop() { int z=0; c: digitalWrite(ledred, LOW); digitalWrite(ledyellow, LOW); int BV = analogRead(0); //button check if (BV>10){ digitalWrite(ledred, HIGH); delay(1000); } int pirvalue = digitalRead(pirmove); if(pirvalue == HIGH || z >= 2) { //1:if 1 time move digitalWrite(ledblue, LOW); delay(1000); z=z+1; if(pirvalue == HIGH || z >= 2){ //2: if 2 times move digitalWrite(ledred, HIGH); myVR.end(); sendSMS("____________", "Secutiry active"); myVR.begin(9600); } else { //2: goto c; } } else if (pirvalue == LOW) { //1: digitalWrite(ledblue, HIGH); delay(2000); z = 0; } goto c; } } void sendSMS(String phone, String message) { SIM800.begin(9600); sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)! sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z SIM800.end(); } String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ Serial.println(_resp); // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема }в 069 строке что происходит ?
Это метка для goto
в 069 строке что происходит ?
это просто кто-то не умеет проектировать структуру программы :) - в процедуре из 60 строк два перехода по метке ...
Подозреваю, что это сделано. чтобы управлять обнулением z .... потому что автор еще не проходил про статик переменные
Да код дерьмо, но я бы не писал сюда, если бы он был идеален.
Я новичок в этом деле, и обратился сюда, как к более опытным.
Ну а что мешает поставить вывод сериал после вашего аналогрид(0) что бы убедиться выполняется он или нет? Ну и так далее.
Спасибо за ответ
когда есть аналогрид(0) он работает прекрасно.
но функция sms нет. Оно заходит в нее отправляет первую команду в модуль. А он не реагирует. То есть не выполняет ее.
Как только я коментрую аналог рид. Sms работает.
И я не могу понять
каким образом оно может мешать.
Мы тоже не можем понять - кто эти "он" , "они", "оно".
Берите самый минимальный вариант - отсылание смс. Работает? Добавьте аналогрид в сериал. Работает? Допишите if(). Продолжает работать?
Смс отдельно работают
аналог рид работает отдельно
ставлю смс перед аналог рид - работает
ставлю аналог рид перед смс. - аналог рид работает, смс нет., удаляю аналог рид - смс начинают работать.
Относительно if после аналог рид. Оно даже не выполняется. То есть мешает исключительно аналог рид.
Для смс не нужно аналог рид. И не нужна та переменная в которую записывается analogRead.
У вас там ещё написано всякого.
В то, что аналогрид ломает работу софтсериала смогу поверить только в том случае, если вы умудрились модем повесить на A0.
А чтобы if не выполнялось - это из области невероятных событий.
По порядку.
Аналогрид не работу софтсериала ломает. Сериал работает. На GSM модуль идет команда. Но он не отвечает.
Убираю аналог рид - начинает отвечать.
Относитель if
В коде
int BV = analogRead(0);
if(BV>10){
digitalWrite(led, HIGH);
}
Когда идет считывание с 0 аналогового пина, там значение 0 - 1. То есть в if оно не идет. LED не горит.
присмотрись - у него два софтсериала. Работа более одного софтсериала в программе, вообще-то, не гарантируется. Все эти трюки с SoftSerial.begin() end() когда работают, а когда нет.
То, что влияет analogRead() - это, конечно, интересно... но вряд ли эта информация полезна для реального применения.
присмотрись - у него два софтсериала. Работа более одного софтсериала в программе, вообще-то, не гарантируется. Все эти трюки с SoftSerial.begin() end() когда работают, а когда нет.
То, что влияет analogRead() - это, конечно, интересно... но вряд ли эта информация полезна для реального применения.
Ну так analogRead() не относится ни к одному из SoftSerial.
Да два. Но когда нет analogRead(). тоже два остаються. И работает все нормально.
0 - 1 - это подозрительно и несвойственно аналогриду.
Но, если не хотите отлаживать, как я написал - продолжайте искать кошелек под фонарем, а не там, где обронили.
очередной вопрос из разряда "как мне перевезти куб щебня на детском самокате? Сменить транспорт не предлагать!!!"
ровно как в соседней ветке про "оптимизацию"
Ну, а чего Вы хотели, если код Вы привели только в 9-ом посте, через 17 часов после открытия темы? Тема в которой нет кода (или есть что-то некомпилируемое, потому что автор "подумал"), обречена на флуд и глум, Вы его и получили.
Теперь Вы код выложили, дайте народу немного отойти, ибо вектор на флуд и глум Вы уже задали, он в одночасье не изменяется.
Правда, я сомневаюсь, что это минимальный код и из него нельзя ничего выбросить так, чтобы проблема осталась. Но это Ваша проблема. а не моя. Я Вам писал, чем короче код, тем больше вероятность, что кто-то за него возьмётся.
И, да, кстати, крайне важный вопрос - что у Вас за контроллер? Они ведь разные бывают. Колитесь. Почему из Вас всё клещами надо тянуть? Вы не читали правила подготовки вопроса в "Песочнице"?
Когда идет считывание с 0 аналогового пина, там значение 0 - 1. То есть в if оно не идет. LED не горит.
Чот падазрительна...
там значения из клавиатуры.
Пока кнопку не нажму значение - 0-1.
Я зделал как вы написали раньше. Та самая проблема.
нет analogRead - работает
есть - sms не работают
буду следовать вашим словам. лишь бы они помогли
функцию sms нету смысла делать короче. поскольку она даже не начинает работать не работать.
или есть?
#include <OneWire.h> #include <SoftwareSerial.h> SoftwareSerial SIM800(5, 6); String _response = ""; void setup() { Serial.begin (9600); } void loop() { int BV = analogRead(0); //button check if (BV>50){ Serial.print("ok"); } sendSMS("+380973545446", "Secutiry active"); delaay(); } void delaay(){ delay(1000000); return; } void sendSMS(String phone, String message) { SIM800.begin(9600); sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)! sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z SIM800.end(); } String sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... _resp = waitResponse(); // ... ждем, когда будет передан ответ Serial.println(_resp); // Дублируем ответ в монитор порта } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема }буду следовать вашим словам.
Так следуй! Тебя про контроллер спросили - пять раз надо спрашивать?
Arduino Uno.
клавиатура аналоговая - от "RobotDyn"
отправка sms - GSM-SIM800L
По поводу кода, Вы там ребёнка с водой выплеснули.
Я немного поправил Ваш код.
Сделайте точно, что я говорю:
1. Выполните код как есть
2. Выполните с закомментированной строкой №16
3. Выложите сюда копипасты монитора порта
После этого, возможно, я снова поправлю и снова попрошу Вас сделать тоже самое.
#include <OneWire.h> #include <SoftwareSerial.h> SoftwareSerial SIM800(5, 6); String _response = ""; void setup() { Serial.begin (9600); Serial.println("===== Started ===="); } void loop() { int BV = 321; BV = analogRead(0); //button check Serial.println("BV=");Serial.println(BV); if (BV > 50) { Serial.println("ok"); } sendSMS("+380973545446", "Secutiry active"); delaay(); } void delaay() { delay(1000000); return; } void sendSMS(String phone, String message) { SIM800.begin(9600); sendATCommand("AT", true); // Отправили AT для настройки скорости обмена данными sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)! sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения sendATCommand(message + "\r\n\032", true); // После текста отправляем перенос строки и Ctrl+Z SIM800.end(); } void sendATCommand(String cmd, bool waiting) { String _resp = ""; // Переменная для хранения результата Serial.println(cmd); // Дублируем команду в монитор порта SIM800.println(cmd); // Отправляем команду модулю if (waiting) { // Если необходимо дождаться ответа... Serial.println("Going to wait"); // ... оповещаем об этом и... Serial.println("waitResponse()="); Serial.println(waitResponse()); // ... ждем, когда будет передан ответ } return _resp; // Возвращаем результат. Пусто, если проблема } String waitResponse() { // Функция ожидания ответа и возврата полученного результата String _resp = ""; // Переменная для хранения результата long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд) while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то... if (SIM800.available()) { // Если есть, что считывать... _resp = SIM800.readString(); // ... считываем и запоминаем } else { // Если пришел таймаут, то... Serial.println("Timeout..."); // ... оповещаем об этом и... } return _resp; // ... возвращаем результат. Пусто, если проблема }Да, кстати, в строках №№ 55 и 56 грубая ошибка. На нынешнюю проблему не влияет, но так делать нельзя!
И чо, клавиатура у тебя тока 0 и 1 отдает?
"Пусть безумная идея -
не ругайте сгоряча"
Заменить имя переменной "BV" на что-нибудь более другое.
Спасибо большое зделал так как вы сказали.
не знаю как вставлять изображения
по этому:
https://ibb.co/QXhM40k
https://ibb.co/QNMTfZD
1 вариант как вы понимаете з той строкой.
всюда
Timeout...
Между слов когда gsm выполняет функцию - возвращает ОК
2ссылка
без той строки
всё работает)
смс прийшло.
Делал уже)
int BV = analogRead(0);
int BV = analogRead(A0);
int BV; int analogPin = A0; loop{ BV=analogRead(analogPin); }переменные тоже менял
И чо, клавиатура у тебя тока 0 и 1 отдает?
нет клавиатура дает в зависимости от кнопки от 500 до 1020 примерно.
Если кнопка не нажата - отдает 0-1
не знаю как вставлять изображения
Простите, Вы специально издеваетесь? Нафига мне Ваши изображения? В мониторе порта разве есть что-то кроме текста? Вот этот текст и скопипастите сюда! Для обоих случаев и не забудьте подписать что для какого.
2 случай(закоментированая 16 строка)
Ну чё парни?
не знаете причину?
А выполняеться – это что делать?
Не понимаю вопрос.
У нас нет проблем с аналоговым пином в разнообразнейших комбинациях. Криминала в скетче лично я не вижу.
Ну так и почему может не работать gsm модуль из-за analogRead?
Ну чё парни?
не знаете причину?
Нет не знаем. Но, лично я готов продолжить исследование до победного конца, только на этот раз, простите, в режиме zero-tolerance.
Я уже устал по два или три раза просить Вас что-то мне сказать или сделать. Поэтому, хотите - продолжим, но - один косяк (не выложили то, что просил, или выложили не так) - я второй раз не прошу, а тихо сливаюсь из темы.
Продолжим?
BV стандартный макрос - #define _BV(bit) (1 << (bit))
Вам уже писали придумать ДРУГОЕ имя переменной - вдруг получится ?
извините за прошлое, парни.
Готов продолжить.
Постараюсь без тупняков.
Не получилось.
Даже пину переменную давал.
Хорошо, только я не обещаю "в режиме чата". Сейчас я подготовлю новый тест и инструкции по его запуску. Но если не успею выложить сегодня, выложу завтра.
Спасибо
Дайте, пожалуйста ссылки на Ваши библиотеки, а то я сдуру скачаю другие с такими же названиями.
Просто не до конца понимаю суть просьбы.
В последнем коде который вы мне скидывали. Там только стандартные. Которые у всех одинаковые.
Ссылки врятли найду на все которые скачал.
НО засунул все свои библиотеки в 1 архив.
Думаю так будет даже проще.
https://github.com/KovalchukVLad/library.git
Это интересно. А что, существует какое-то специальное место, где лежат "стандартные библиотеки"? Помоему они все на гите, и стандартные и нестандартные