подскажите как остановить цикл For.

TovBender
Offline
Зарегистрирован: 12.04.2015

Подскажите пож. как остановить цикл FOR

или временно его приостановить, чтобы выполнить другое действие.

Написал скетч, измерение температуры, и управление радио розетками.

Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла.

измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура.

приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.

 

 

OneWire oneWire(9); // вход датчиков 18b20
DallasTemperature ds(&oneWire);

DeviceAddress sensor1 = {0x28, 0x6D, 0x74, 0x23, 0x05, 0x0, 0x0, 0x28};
DeviceAddress sensor2 = {0x28, 0xB, 0x41, 0x23, 0x05, 0x0, 0x0, 0xF};

void setup()
{

 Serial.begin(38400); //установка порта на скорость 9600 бит/сек
 ds.begin();
 
}

void loop()

{

while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте

int val = Serial.read() - '0';

if (val == 1) transmit(RF1ON);    //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)

if (val == 2) transmit(RF2ON);

if (val == 8){
 
  for (int i = 0; i < 25; i++){ // крутим цикл
ds.requestTemperatures(); // считываем температуру с датчиков

Serial.print("Temper1 ");
    Serial.print(ds.getTempC(sensor1)); // отправляем температуру
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
Serial.println();
  }
}

std
Offline
Зарегистрирован: 05.01.2012

Поменять на while, останавливать правкой переменной условия (чтобы оно сработало).

Например

byte i=0;

void f(){
  while(i<15){
    doShit();
    i++;
  }
}

// ............
i=20; // stop cycle

Переменная i должна быть глобальной.

А лучше

byte i=0;
boolean bStopFlag=false;

void f(){
  while(i<15 && !bStopFlag){
    doShit();
    i++;
  }
}

// ............
bStopFlag=true; // stop cycle

Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

для остановки циклов есть оператор break;

TovBender
Offline
Зарегистрирован: 12.04.2015

пробовал break; не помогает.

std
Offline
Зарегистрирован: 05.01.2012

Это странно....

toc
Offline
Зарегистрирован: 09.02.2013

>> подскажите как остановить

добавьте

while(1);

TovBender
Offline
Зарегистрирован: 12.04.2015

если заменить функцию For ?

TovBender
Offline
Зарегистрирован: 12.04.2015

у меня while (Serial.available() == 0); //функция проверяет что пришло из блютуз модуля

TovBender
Offline
Зарегистрирован: 12.04.2015

while (Serial.available() == 0); //функция делает проверку какую команду прислал блютуз модуль.

если 1, передача по радио вкл. радио розетку. 2 тожесамое но др. розетка.  - 8 включить проверку датчиков температуры. запускает цикл, который не останавливается если нажать 1 или 2. значит я не могу отправить команду радио розеткам на вкл. или выкл. пока не кончится цикл проверки.

значит надо если придет любая другая команда 1 или 2 . останавливать цикл проверки. чтоб сработали эти команды.

и как мне остановить цикл. ???????

TovBender
Offline
Зарегистрирован: 12.04.2015

И как можно остановить бесконечный цикл через 1 илии 2 часа ??

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .

if (val == 8) serial_cicle=25;
//следующей строкой проверку флага:

if(serial_cicle) 
    { serial_cicle --;
     ds.requestTemperatures(); // считываем температуру с датчиков Serial.print("Temper1");
    Serial.print(ds.getTempC(sensor1)); // отправляем температуру
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
    Serial.println();
  }
// таким образом произойдёт то-же самое, что было, только обрабатываться будет весь loop
                      

 

TovBender
Offline
Зарегистрирован: 12.04.2015

dimax пишет:

TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .

if (val == 8) serial_cicle=25;
//следующей строкой проверку флага:

if(serial_cicle) 
    { serial_cicle --;
     ds.requestTemperatures(); // считываем температуру с датчиков Serial.print("Temper1");
    Serial.print(ds.getTempC(sensor1)); // отправляем температуру
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
    Serial.println();
  }
// таким образом произойдёт то-же самое, что было, только обрабатываться будет весь loop
                      

 

пишет ошибку
sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:56:15: error: 'serial_cicle' was not declared in this scope
sketch_apr12a.ino:58:5: error: 'serial_cicle' was not declared in this scope
sketch_apr12a.ino: At global scope:
sketch_apr12a.ino:81:1: error: expected declaration before '}' token
Ошибка компиляции.

 

 

TovBender
Offline
Зарегистрирован: 12.04.2015

std  как мне это прикрутить или заменить у меня в коде.

std пишет:

 

Например

byte i=0;

void f(){
  while(i<15){
    doShit();
    i++;
  }
}

// ............
i=20; // stop cycle

Переменная i должна быть глобальной.

А лучше

byte i=0;
boolean bStopFlag=false;

void f(){
  while(i<15 && !bStopFlag){
    doShit();
    i++;
  }
}

// ............
bStopFlag=true; // stop cycle

Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь Dimax

продекларировал теперь новая ошибка

sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:57:29: error: expected primary-expression before '=' token
sketch_apr12a.ino:59:18: error: expected primary-expression before ')' token
sketch_apr12a.ino:60:23: error: expected primary-expression before ';' token
Ошибка компиляции.

 

TovBender
Offline
Зарегистрирован: 12.04.2015

как обойтись без цикла.

если надо постоянный визуальный контроль за температурой.

а телефон на базе андроид сам контролирует привышение температуры.

как включить что либо пока идет цикл.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, я вам дал только фрагмент. Разумеется нужно объявить переменную, serial_cicle, компилятор как раз на это ругается. Помимо того нужно убрать ещё один  while из скетча.   while (Serial.available() == 0);  Подобное выражение имеет очень ограниченное применение, потому что полностью застопоривает исполнение программы. Лучше вообще его никогда не использовать.  Нужно либо отказаться от него вообще, либо перевести проверку на оператор if

void loop() {
 if (Serial.available() != 0) { 
 int val = Serial.read() - '0';
 if (val == 1) transmit(RF1ON);
 if (val == 2) transmit(RF2ON);
 if (val == 8) serial_cicle=25;
 }

if(serial_cicle) 
    { serial_cicle --;
    ds.requestTemperatures(); // считываем температуру с датчиков Serial.print("Temper1");
    Serial.print(ds.getTempC(sensor1)); // отправляем температуру
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
    Serial.println();
   }
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а перенести проверку сериала в цикл ? или вообще убрать цикл опроса - луп сам цикл....
проверку 25-ти замеров можно и по другому организовать

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

TovBender пишет:

Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла. измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура. приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.

Мне кажется, что для такой ситуации как раз и были придуманы прерывания. :)

С другой стороны, раз уж Вы взались автоматизировать, то, на мой взгляд, надо свести человеческие вмешательства к минимуму: пусть автоматика сама регулирует температуру - у нее это получится лучше.

TovBender
Offline
Зарегистрирован: 12.04.2015

мне не надо регулировать температуру. все само работает.

1   -  void loop()  как цикл у меня не работает.

пришлось дополнить цыклом опроса датчиков.

 

TovBender
Offline
Зарегистрирован: 12.04.2015

если убираю For цикл опроса датчиков void loop()

не хочет этого делать.

нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.

нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.

радио розетки исправно меня слушаются.

но если сам прописываю цикл For ....   вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.

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

 

void loop()

{

while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте

// доступные для чтения данные.

int val = Serial.read() - '0';

if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)

if (val == 2) transmit(RF2ON);

if (val == 3) transmit(RF3ON);

if (val == 4) transmit(RF4ON);
// if (val == 5) {transmit(RF1ON);transmit(RF2ON);transmit(RF3ON);}

if (val == 8){

// // for (int i = 0; i < 5; i++){ // крутим цикл
ds.requestTemperatures(); // считываем температуру с датчиков

Serial.print("Temper1 ");
Serial.print(ds.getTempC(sensor1)); // отправляем температуру
Serial.println(" *C");
Serial.print("Temper2 ");
Serial.print(ds.getTempC(sensor2));
Serial.println(" *C");

}
}
}

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

власть захватывает то блок while (Serial.available() == 0); , то блок for

TovBender
Offline
Зарегистрирован: 12.04.2015

если убираю For цикл опроса датчиков void loop()

не хочет этого делать.

нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.

нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.

радио розетки исправно меня слушаются.

но если сам прописываю цикл For ....   вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.

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





void loop()

{

while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте

// доступные для чтения данные.

int val = Serial.read() - '0';



if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)

if (val == 2) transmit(RF2ON);

if (val == 3) transmit(RF3ON);

if (val == 4) transmit(RF4ON);
// if (val == 5) {transmit(RF1ON);transmit(RF2ON);transmit(RF3ON);}


if (val == 8){

// // for (int i = 0; i < 5; i++){ // крутим цикл
ds.requestTemperatures(); // считываем температуру с датчиков


Serial.print("Temper1 ");
Serial.print(ds.getTempC(sensor1)); // отправляем температуру
Serial.println(" *C");
Serial.print("Temper2 ");
Serial.print(ds.getTempC(sensor2));
Serial.println(" *C");

}
}
} 

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
boolean sendTemper=0;
void loop()
{
  if(Serial.available() != 0);
  {
    int val = Serial.read() - '0';
    if (val == 1) transmit(RF1ON);
    if (val == 2) transmit(RF2ON);
    if (val == 3) transmit(RF3ON);
    if (val == 4) transmit(RF4ON);
    if (val == 8) sendTemper=!sendTemper;
  }

  if(sendTemper)
  {
    ds.requestTemperatures();
    Serial.print("Temper1 ");
    Serial.print(ds.getTempC(sensor1));
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
  }
}

"8" - вкл/выкл передачи температуры... или по нажатию "8" нужно отослать 25 замеров температуры ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, я же вам написал в сообщении #15 что нужно делать. В чём пролема? Кстати, когда обращаетесь к кому-то конкретно -пишите ник того человека, к кому обращаетесь. А то непонятно кому адресуются ваши высказывания.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

dimax , и я просмртрел-пропустил..... прошу пардона :)

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь   Dimax

всё попробовал всё равно пишет  об ошибке 

sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:73:16: error: expected primary-expression before ')' token
sketch_apr12a.ino:74:23: error: expected primary-expression before ';' token
Ошибка компиляции.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, вы неправильно вставляете скетч. Обратите вгнимание в верхнем правом углу объекта со скетчем есть всплывающее меню. там есть кнопка скопировать.

TovBender
Offline
Зарегистрирован: 12.04.2015

dimax

Ничего не работает по вашему скетчу пишет ошибку .

sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:41:28: error: expected primary-expression before '=' token
sketch_apr12a.ino:44:16: error: expected primary-expression before ')' token
sketch_apr12a.ino:45:22: error: expected primary-expression before ';' token
Ошибка компиляции.
 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <RemoteSwitch.h> 


#define RF1ON 487630 //(18062) код кнопки от радиопульта  для радио розеток
#define RF2ON 487632
#define RF3ON 487648
#define RF4ON 487650
#define PERIOD 258; //(294) period duration: - полученные из (монитор порта)
#define PERIOD 265;
//#define PERIOD 184;
int var;
#define transmit
#define serial_cicle 

OneWire oneWire(9); // вход датчиков 18b20
DallasTemperature ds(&oneWire);


DeviceAddress sensor1 = {0x28, 0x6D, 0x74, 0x23, 0x05, 0x0, 0x0, 0x28};
DeviceAddress sensor2 = {0x28, 0xB, 0x41, 0x23, 0x05, 0x0, 0x0, 0xF};
DeviceAddress sensor3 = {0x28, 0xBC, 0x41, 0x23, 0x05, 0x0, 0x0, 0xF};
DeviceAddress sensor4 = {0x28, 0xBA, 0x41, 0x23, 0x05, 0x0, 0x0, 0xF};


void setup()
{

 Serial.begin(38400); //установка порта на скорость 9600 бит/сек
 ds.begin();
 
}


void loop() {
 if (Serial.available() != 0) { 
 int val = Serial.read() - '0';
 if (val == 1) transmit(RF1ON);
 if (val == 2) transmit(RF2ON);
 if (val == 8) serial_cicle=25;
 }

if(serial_cicle) 
    { serial_cicle --;
    ds.requestTemperatures(); // считываем температуру с датчиков Serial.print("Temper1");
    Serial.print(ds.getTempC(sensor1)); // отправляем температуру
    Serial.println(" *C");
    Serial.print("Temper2 ");
    Serial.print(ds.getTempC(sensor2));
    Serial.println(" *C");
    Serial.println();
   }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, вы не объявили переменную. Посмотрите 15 строку что это? Дожна быть переменная!  Например так: byte serial_cicle;

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь Dimax

что в строчках 39 и 40 что за трансмит ???

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, это не ко мне вопрос. Я скопировал ваши команды из первого сообщения.

TovBender
Offline
Зарегистрирован: 12.04.2015

тов Dimax

ваш скетч. заработал. но пока идет цикл чтения датчиков. опять ни чего нажать не возможно, пока цикл не дойдет до конца. 

 

TovBender
Offline
Зарегистрирован: 12.04.2015

да извиняюсь,  точно это из моего скетча. передача кода на радио розетки.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

TovBender, зачем пакет из 25-ти замеров ?

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь Dimax

это было временно для проверки скетча, будет ли он останавливаться если нажать на отправку управления радио розеткой.

TovBender
Offline
Зарегистрирован: 12.04.2015

тов Dimax.

я делал  скетч, чтоб видеть как менятся температура 4 датчиков. чтом они постоянно показывали температуру, это улица, дом и сауна, данные приходят на телефон.

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

вот я и искал разные варианты, если вкл. постоянный цикл, то выйти из него я не знаю как, вот и поставил временно 25. чтоб цыкл если все не правельно хоть иногда сам останавливался.

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

ничего не получается, 4 дня мучуюсь.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

TovBender , в #23 убрать строки 11, 14 - будут постоянно опрашиваться приёмник команд и происходить отсылка значения температуры
...строки 14....23 - продублировать код  для остальных двух датчиков

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, по идее  вам нужно  опрос датчиков производить не на каждом круге loop, а  по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.

TovBender
Offline
Зарегистрирован: 12.04.2015

да возможно вы правы

TovBender
Offline
Зарегистрирован: 12.04.2015

тов Dimax.  Большое спасибо за советы. начинаю вникать в коды.

подскажите а как делать опрос датчиков по таймеру, и как вклинить ее в мой скетчь.

и еще может вы програмке в App Iventor разбираетесь ?

это написание програмулек для мобильных телефонов. под Андроид.

bwn
Offline
Зарегистрирован: 25.08.2014

dimax пишет:

TovBender, по идее  вам нужно  опрос датчиков производить не на каждом круге loop, а  по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.

Мои пять копеек, уйдите от библиотеки Далласа на Onewire и делайте на ней. Описание команд датчика. Одна секунда тоже слишком частый интервал, не меняется температура в объемах с такой скоростью. 30с-1мин вполне достаточно для помещения. Таймер делаете на основе этого . И не забудьте гистерезис сделать, иначе будете постоянно щелкать в граничной точке.
Алгоритм простой - взвели таймер, по достижении времени дали команду на конвертацию всех датчиков, взвели флаг и таймер на 750мС, по достижении провели считывание данных с датчиков, сбросили флаг, вернулись в начало. Все проверки в loop, if-ами.

Для спокойствия, можете еще CRC сверять, в стандартных примерах OneWire есть как.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

bwn,  вы сейчас к кому обращаетесь?  Если к Т.С. то для него это слишком сложно :)

bwn
Offline
Зарегистрирован: 25.08.2014

dimax, немного добавил в Вашим рекомендациям. Сам тоже чайник и в даллосовской библиотеке увяз глубже, чем в OneWire. В итоге напрямую все пошло сразу (там пять команд всего) и легко разбить на две функции (конвертация, считывание-пересчет).
От и говорю ТС, как чайник чайнику - OneWire проще. ИМХО.

TovBender
Offline
Зарегистрирован: 12.04.2015

bwn подскажите как пользоваться OneWire как добыть температуру

TovBender
Offline
Зарегистрирован: 12.04.2015

тов Dimax.  Большое спасибо за советы. начинаю вникать в коды.

подскажите а как делать опрос датчиков по таймеру, и как вклинить ее в мой скетчь.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

TovBender, про таймер вам написал bwn, посмотрите внимательно его фразу "таймер делаете на основе этого". Отказываться от библиотеки dallas я вам не советую, ваш уровень познания недостаточен что бы переделать полностью весь код. А делать это за вас мне не хочется :) Что бы удовлетворить любопытство посмотрите сюда  Этот метод позволяет работать без тормозов используя только библу OneWire.

bwn
Offline
Зарегистрирован: 25.08.2014
#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

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

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

Попробуйте сперва сами, считывание адресов лучше сделать один раз в setup (потом вообще вставить их в программу), строка delay(1000); делит код на две части, перед ней идут команды на конвертацию, после нее считывание данных.

TovBender
Offline
Зарегистрирован: 12.04.2015

1 все кнопки у меня в телефоне. который управляет Ардвиной. через блютуз. вывод данных тоже смотрю на экране телефона.       а не на дисплее приставленном к Ардвине, если успели заметить. вы значит не внимательно прочли мои вопросы. не видели весь скетч.

2 чтобы сделать опрос датчиков по времени НУЖЕН ? такой большой код ?

bwn
Offline
Зарегистрирован: 25.08.2014

TovBender пишет:

1 все кнопки у меня в телефоне. который управляет Ардвиной. через блютуз. вывод данных тоже смотрю на экране телефона.       а не на дисплее приставленном к Ардвине, если успели заметить. вы значит не внимательно прочли мои вопросы. не видели весь скетч.

2 чтобы сделать опрос датчиков по времени НУЖЕН ? такой большой код ?

Если вы откомпиллируете два кода, с dallasTemperanure и тот который я дал, с удивлением обнаружите, что этот большой код занимает на 1,5К меньше места в памяти. 3/4 в этом примере вода, которую можно смело удалить. Если нет желания пробовать и анализировать, дело ваше.
Кстати опроса по времени там как раз нет.

TovBender
Offline
Зарегистрирован: 12.04.2015

товарищь  Dimax  .      Большое спасибо за ваши советы. буду пробовать дальше. пока еще не во всем разобрался, но уже начинаю понимать в коде, (наверное) .

пока не разобрался как опрашивать датчики по времени . чтоб не исползовать For и Delay.

буду пробовать дальше.

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

Спасибо за ваши советы.