Вопрос: I-Button считывается через раз

jurijt
Offline
Зарегистрирован: 27.07.2016

Добрый день!

Подскажите, почему в Loop цикле I-Button считывается через цикл?

Т.е приведенный код (лишнее убрано):



void loop(void) {
delay(500); // пробовал разные величины
Serial.print(" Kliucei v pamiati : ");
Serial.println(bKey_Count+1);
   if (iButton.search(bKey_Data)){
        Serial.println(" Naiden kliuc : "); 
        iButton.reset();   
   }  
}  /////////////END LOOP///////////

выдает при постоянно приложеном ключе следующий листинг:



..........
Kliucei v pamiati : 1
 Kliucei v pamiati : 1
 Naiden kliuc : 
 Kliucei v pamiati : 1
 Kliucei v pamiati : 1
 Naiden kliuc : 
 Kliucei v pamiati : 1
 Kliucei v pamiati : 1
 Naiden kliuc : 
 Kliucei v pamiati : 1
 Kliucei v pamiati : 1
 Naiden kliuc : 
 Kliucei v pamiati : 1
 Kliucei v pamiati : 1
 Naiden kliuc : 
 Kliucei v pamiati : 1
.......

Библиотеку OneWire обновлял, с задержками - настройками игрался.

Можно ли решить эту проблему, чтоб не городить более сложный код для определения длительного подключения мастер-ключа ?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А делай зачем вообще нужен? Скорее всего пападаете в делай, вот ничего и не считывается

jurijt
Offline
Зарегистрирован: 27.07.2016

Penni пишет:
А делай зачем вообще нужен? Скорее всего пападаете в делай, вот ничего и не считывается

Делай нужен чтоб в терминал не так часто шли сообщения. Но даже откючив полностью, или наоборот увеличив, ничего не меняется. Ровно через раз считывается ключ.

b707
Offline
Зарегистрирован: 26.05.2017

jurijt - если вы рассчитываете на помощь - приведите полный код. Догадываться по двум строчкам, что вы там наворотили в остальном коде - занятие бестолковое.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Чтобы сообщения не так часто шли надо выводить их только когда ключ приложили...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

jurijt пишет:

(лишнее убрано):

Вы не задумывалсь о том, что если бы Вы действительно знали что там лишнее, а что - нет, Вам бы не пришлось задавать этот вопрос?

Это не значит, что надо вываливать код на 1000+ строк. Правильное поведение таково: сделать код, который демонстрирует проблему, но имеет минимальный размер. И именно этот код выложить.

jurijt
Offline
Зарегистрирован: 27.07.2016

b707 пишет:

jurijt - если вы рассчитываете на помощь - приведите полный код. Догадываться по двум строчкам, что вы там наворотили в остальном коде - занятие бестолковое.

Так в том и беда, что отключив все что "я наворотил", получается тот же результат.

Вот именно  этот код:



#include <OneWire.h> 
OneWire iButton(10);  // создаём объект 1-wire на 10 выводе

int intFindedKey;     
byte bKey_Data[8];    
byte bKey_Count;      
byte bKey_Max;        

void setup() {
  Serial.begin(57600); 
}

void loop(void) {
delay(500); // zaderzka   na vremia nastroek 
Serial.println(" Kliucei v pamiati : ");
   if (iButton.search(bKey_Data)){
        Serial.println(" Naiden kliuc : "); 
        iButton.reset();   
   }  
} 

 Дает указанный результат:



 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Naiden kliuc : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Naiden kliuc : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Naiden kliuc : 
 Kliucei v pamiati : 
 Kliucei v pamiati : 
 Naiden kliuc : 

Показан момент подключения ключа, и далее до безконечности пока ключ удерживается.

Менял и полностью убирал Делай, скорость порта пробовал ставить 9600.

Все одинаково.

b707
Offline
Зарегистрирован: 26.05.2017

Все так и должно быть, имхо.

Вы читали описание функции search() ? При каждом вызове она читает из шины адрес следующего девайса, а когда девайсов больше нет - выдает нулевое значение. 

У вас при приложенном ключе на шине один девайс. Функция search() при первом вызове выдает его адрес, при втором - выдает ноль, так как девайсы кончились, при третьем - снова адрес ключа и тд. Вот и выходит "через раз".

jurijt
Offline
Зарегистрирован: 27.07.2016

b707 пишет:

Все так и должно быть, имхо.

.......

У вас при приложенном ключе на шине один девайс. Функция search() при первом вызове выдает его адрес, при втором - выдает ноль, так как девайсы кончились, при третьем - снова адрес ключа и тд. Вот и выходит "через раз".

А разве reset() это дело не сбрасывает?

jurijt
Offline
Зарегистрирован: 27.07.2016

b707!

Спасибо за наводку. В примерах работы с iButton   используют .reset(), а надо бы .reset_search();

Проблема решена! Всем спасибо!

Правильное решение:

   if (iButton.search(bKey_Data)){
        Serial.println(" Naiden kliuc : "); 
        iButton.reset_search();