В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.
В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.
Спасибо за помощь, но не помогло - все равно срывает видео сигнал.
Попробуйте ветку else вместо for разбить на еще один if-else по образу и подобию. Добавляется еще одна булева переменная, в зависимости от нее работаем с нулевым или первым датчиком.
Важно - flagDall должен инвертится в зависимости от второй булевой переменной, аналогично и переменная prevTime.
Если интервалы останутся как сейчас, можно сделать проще, просто разбить на if-else и добавить булеву переменную. После первой конвертации считается один датчик, после следующей второй.
P/S Еще немного времени сэкономите, если время возврата измените на миллисекунды и уберете операцию *1000.
Ну и на 16 делить уже в основном цикле.
Попробуйте пример Dimax модифицировать как выше написал, он еще быстрее должен работать.
Кроме 46 строки, i < 3, криминала не вижу. Вечером попробую запустить. Должно быть: в первую секунду нули, далее температура. Чтобы постоянно в монитор не долбило, принты лучше убрать в конец функции, но здесь от задачи зависит. У меня массив Temp[] создан для обработки в других функциях.
Если вам нужны постоянные небольшие интервалы, то пример Dimax удобнее. Я чаще использую двух-трехминутные и собаку держу на основной ее функции, поэтому millis().
Cам пример модифицирован полностью от Dimax, таймер заменил на millis(), а работают одинаково.
А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)
#include <OneWire.h>
OneWire ds(2);
byte addr[8]={0x28,0x04,0x13,0x80,0x06,0x00,0x00,0xF8};
float celsius;
void setup(void) {
Serial.begin(9600);
WDTCSR=B00011000; //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=B01000110; // разрешение прерывания + выдержка 1 секунда(55 страница даташита)
} // можно выбрать от 16мс до 8 с
void loop(void) { }
ISR (WDT_vect){
static boolean n=0;
n=~n;
if (n) {ds.reset();
ds.select(addr);
ds.write(0x44);
}
else {ds.reset();
ds.select(addr);
ds.write(0xBE);
celsius = (ds.read() | (ds.read()<<8))/16.0;
Serial.print(" Temperature = ");
Serial.println(celsius);
}
}
Автодетекта адреса ds18b20 нет, так что нужно адрес указать вручную. Работает в дефолтовом 9-бит режиме.
А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?
А если WDT в проекте уже занят по прямому назначению, то надо использовать другой таймер?
Берите с бабушкой millis().
//***Функция считывания температуры c Далласов*****
void dallRead(unsigned long interval){
static unsigned long prevTime = 0;
if (millis() - prevTime > interval) { //Проверка заданного интервала
static boolean flagDall = 0; //Признак операции
prevTime = millis();
flagDall =! flagDall; //Инверсия признака
if (flagDall) {
ds.reset();
ds.write(0xCC); //Обращение ко всем датчикам
ds.write(0x44); //Команда на конвертацию
flagDallRead = 1; //Время возврата в секундах
}
else {
byte i;
int temp;
for (i = 0; i < 3; i++){ //Перебор количества датчиков
ds.reset();
ds.select(addr[i]);
ds.write(0xBE); //Считывание значения с датчика
temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
Temp[i] = (float)temp / 16.0;
flagDallRead = 2; //Время возврата в секундах
}
}
}
}
//--------------------------------------------------
Вызов из loop - dallRead(flagDallRead*1000);
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.
Ночь дело темное, правильно Вы говорили) Пропустил мимо ключевой слово static, именно оно не даёт уничтожить локальную переменную после цикла.
А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)
#include <OneWire.h>
OneWire ds(2);
byte addr[8]={0x28,0x04,0x13,0x80,0x06,0x00,0x00,0xF8};
float celsius;
void setup(void) {
Serial.begin(9600);
WDTCSR=B00011000; //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=B01000110; // разрешение прерывания + выдержка 1 секунда(55 страница даташита)
} // можно выбрать от 16мс до 8 с
void loop(void) { }
ISR (WDT_vect){
static boolean n=0;
n=~n;
if (n) {ds.reset();
ds.select(addr);
ds.write(0x44);
}
else {ds.reset();
ds.select(addr);
ds.write(0xBE);
celsius = (ds.read() | (ds.read()<<8))/16.0;
Serial.print(" Temperature = ");
Serial.println(celsius);
}
}
Автодетекта адреса ds18b20 нет, так что нужно адрес указать вручную. Работает в дефолтовом 9-бит режиме.
а как сделать с автодетектом?
и если не сложно ответить: что значит магическая строка void setup(void) ? какона работает, что значит указание в вкобках?
не, ну как не имеет, оно же с ардуино так и работает.
я встречал - в приере для датчика температуры, этот пример работает:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
/*
* Main function, get and show the temperature
*/
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
Serial.print("Temperature device ");
Serial.println(sensors.getTempCByIndex(0));
delay(3000);
}
В сетапе считать адреса, занести в массив или еепром, пользоваться.
пример выше - как быбез этого работает.
вот только я так понимаю настоятельно не рекомедуют использовать #include <DallasTemperature.h>
в общем пробовал это вставлять в свою программу - возникают нпонятные проблемы, не разобрался что именно, но программа сразу за считыванием температуры - перестает работать, странно.
DT кому то нравится, кому то нет. Работает вполне корректно, только не уйти от задержки в 750мС + 2К программной памяти сжирает. Dimax считаю пошел по верному пути, прямо прописывая адреса для 1-2 датчиков. Смысл автодетекта только для серийного производства. ИМХО.
не хочется разбивать на 64, смс можно 140 знаков посылать?
проблема в String или в другом?? может писать смс из двух частей а потом в коде оправки их соединять вместе? самый прикол, что первую смс формирую на запуске программы, и она приходит.
И эта смс явно больше 64 знаков. А вот уже последующие смс по запросу - фиг, не хотят..
А насколько чаксты Вы передаете строки? Т.е. сколько времени проходит между двумя отправками?
Не может получиться так, что Вы передаете команде отправки адрес строки, "железка" ее постепенно начинает отправлять, а Вы, не дожидаясь, пока отправка закончится, обнуляете строку и начинаете ее набивать по новой?
нет, я даже делеи порасставлял везде, чтобы печатало. потом отправка смс, во время отправки ничего не печаталось и т.д..
да и без смс там у меня пустое sms_txt получалось. после уменьшения размеров сейчас все шлет без збоев, и даже температуру считывает верно, не сбоит по температуре. мне был важен один датчик. даже стало интересно, потом позже может и термостат управляемый прикручу.
Я не спорю, что без знания С в С++ делать нечего, но я не могу согласиться со словом "достаточно" в Вашем предыдущем посте.
Ок, поправлюсь: для начала - достаточно. Ибо всё равно - учиться всю жизнь. Но я бы поостерёгся прыгать через голову и хвататься сразу за всю специфику С++ - начинать надо, ИМХО, именно с упомянутой книги, остальное - приложится. Полемика ни о чём, К&Р - это библия, без неё никуда.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Блин. Да поймите вы, что изучать сразу ООП без знания самых основ - это как раскурочить движок мерседеса кувалдой и удивляться, почему оно не собирается обратно. Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно. На этом дискуссию сворачиваю, каждый поступает так, как считает нужным.
Помогите решить проблему со срывом синхронизации видеосигнала при выводе показаний температуры с помощью TVout.
https://www.youtube.com/watch?v=aFE4c9pZmNU
Тапками не сильно бейте, я только учусь.
А без прерываний нормально выводит?
Да.
47 пост, функция на millis().
47 пост, функция на millis().
Подскажите пожалуйста как эту функцию привязать к моему примеру?
Объявляете глобально
массив адресов далласов: byte addr[2] [8] = {{xxx,xxx,xxx},{xxx,xxx,xxx}};
массив температур: float Temp[2];
переменную количества секунд: byte flagDallRead;
В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.
Объявляете глобально
массив адресов далласов: byte addr[2] [8] = {{xxx,xxx,xxx},{xxx,xxx,xxx}};
массив температур: float Temp[2];
переменную количества секунд: byte flagDallRead;
В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.
Спасибо за помощь, но не помогло - все равно срывает видео сигнал.
Скетч бы итоговый сбросили. А стандартный пример из OneWire так понимаю работает?
Скетч бы итоговый сбросили. А стандартный пример из OneWire так понимаю работает?
Проблема в том, что во время обновления данных с термодатчика в видеосигнал подмешивается паразитный импульс.
Стандартный пример работает ещё хуже.
Здесь не помогу((((. Думаю проц занят дольше, чем допустимо для обновления кадра. Попробуйте с одним датчиком.
TVout.h не юзал....
может быть в строке #32 добавить задержку на 40 mS ?
Нужно минимум два датчика.
Спасибо что потратили время.
Нужно минимум два датчика.
Спасибо что потратили время.
Если с одним будет работать, можно будет функцию на два блока разбить.
Нужно минимум два датчика.
Спасибо что потратили время.
Если с одним будет работать, можно будет функцию на два блока разбить.
С одним срыв пропал, осталось подергивание экрана на пару пикселей вниз в момент опроса датчика.
Попробуйте ветку else вместо for разбить на еще один if-else по образу и подобию. Добавляется еще одна булева переменная, в зависимости от нее работаем с нулевым или первым датчиком.
Важно - flagDall должен инвертится в зависимости от второй булевой переменной, аналогично и переменная prevTime.
Если интервалы останутся как сейчас, можно сделать проще, просто разбить на if-else и добавить булеву переменную. После первой конвертации считается один датчик, после следующей второй.
P/S Еще немного времени сэкономите, если время возврата измените на миллисекунды и уберете операцию *1000.
Ну и на 16 делить уже в основном цикле.
Попробуйте пример Dimax модифицировать как выше написал, он еще быстрее должен работать.
bwn, что делаю не так?
сначала секунды 2 идут нули, потом секунды 2 идут показания всех трех датчиков, а потом нули до бесконечности...
Пример Dimax работает отлично( не считая что поначалу тоже идут нули), но не берусь его брать т.к. не могу понять вообще...(
Кроме 46 строки, i < 3, криминала не вижу. Вечером попробую запустить. Должно быть: в первую секунду нули, далее температура. Чтобы постоянно в монитор не долбило, принты лучше убрать в конец функции, но здесь от задачи зависит. У меня массив Temp[] создан для обработки в других функциях.
Если вам нужны постоянные небольшие интервалы, то пример Dimax удобнее. Я чаще использую двух-трехминутные и собаку держу на основной ее функции, поэтому millis().
Cам пример модифицирован полностью от Dimax, таймер заменил на millis(), а работают одинаково.
Кроме 46 строки, i < 3, криминала не вижу.
тьфу... заработало, спасибо)
А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)
А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?
А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?
[/quote]
Переставив на 12бит, будет с шагом 0,0625гр. Как переставить, смотрите примеры ниже или описание.
А если WDT в проекте уже занят по прямому назначению, то надо использовать другой таймер?
Берите с бабушкой millis().
Вызов из loop - dallRead(flagDallRead*1000);
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.
Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?
В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.
Ночь дело темное, правильно Вы говорили) Пропустил мимо ключевой слово static, именно оно не даёт уничтожить локальную переменную после цикла.
А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)
а как сделать с автодетектом?
и если не сложно ответить: что значит магическая строка void setup(void) ? какона работает, что значит указание в вкобках?
и если не сложно ответить: что значит магическая строка void setup(void) ? какона работает, что значит указание в вкобках?
Это к Ардуино никакого отношения не имеет. Это - Си. Читать: Керниган, Ритчи. Язык программирования Си.
а как сделать с автодетектом?
В сетапе считать адреса, занести в массив или еепром, пользоваться.
не, ну как не имеет, оно же с ардуино так и работает.
я встречал - в приере для датчика температуры, этот пример работает:
а как сделать с автодетектом?
В сетапе считать адреса, занести в массив или еепром, пользоваться.
пример выше - как быбез этого работает.
вот только я так понимаю настоятельно не рекомедуют использовать #include <DallasTemperature.h>
в общем пробовал это вставлять в свою программу - возникают нпонятные проблемы, не разобрался что именно, но программа сразу за считыванием температуры - перестает работать, странно.
DT кому то нравится, кому то нет. Работает вполне корректно, только не уйти от задержки в 750мС + 2К программной памяти сжирает. Dimax считаю пошел по верному пути, прямо прописывая адреса для 1-2 датчиков. Смысл автодетекта только для серийного производства. ИМХО.
долбаю вариант на 1-вайр - на 1 датчик без адреса 1820
вроде отчасти получается. но не понимаю - он тоже может тормозить программу?
долбаю вариант на 1-вайр - на 1 датчик без адреса 1820
вроде отчасти получается. но не понимаю - он тоже может тормозить программу?
Ни капли, от слова "вообще":
Тормозов - ноль.
Я СДЕЛАЛ ТАК:
потом в программе всталяю значение:
как все это дело улучшить? подозревая есть куча ошибок, но работает.
код не мой. мне нужно было только на один датчик 1820
String которую собрали из кусков для отправки смс - поддерживает только 64 знака???
похоже на то.. :(
String которую собрали из кусков для отправки смс - поддерживает только 64 знака???
похоже на то.. :(
Чой-то? Пока память не кончится, столько и будет в себе держать ;)
тогда не ясно, как толко набирается столько, то потом напечатать стоку, а там только конец строки несколько знаков..
тогда не ясно, как толко набирается столько, то потом напечатать стоку, а там только конец строки несколько знаков..
Там буфер 64 байта. Честно говоря, не разбирался, как печатать длинные строки, но, вероятно, одним из двух путей:
- разбивать на кусочки, не превосходящие 64 байта,
- перед тем, как печатать очередную строку, убедиться, что закончилась отправка предыдущей.
Подумал: есть еще вариант - нельзя вносить изменения в строку до того, как она будет полностью отправлена.
не хочется разбивать на 64, смс можно 140 знаков посылать?
проблема в String или в другом?? может писать смс из двух частей а потом в коде оправки их соединять вместе? самый прикол, что первую смс формирую на запуске программы, и она приходит.
И эта смс явно больше 64 знаков. А вот уже последующие смс по запросу - фиг, не хотят..
отослал строку sms_txt = sms_txt + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + "\n"; delay(10);
она дошла из разных частей кода, значит проблема не в буфере.
В чем проблема, я не знаю.
А насколько чаксты Вы передаете строки? Т.е. сколько времени проходит между двумя отправками?
Не может получиться так, что Вы передаете команде отправки адрес строки, "железка" ее постепенно начинает отправлять, а Вы, не дожидаясь, пока отправка закончится, обнуляете строку и начинаете ее набивать по новой?
нет, я даже делеи порасставлял везде, чтобы печатало. потом отправка смс, во время отправки ничего не печаталось и т.д..
да и без смс там у меня пустое sms_txt получалось. после уменьшения размеров сейчас все шлет без збоев, и даже температуру считывает верно, не сбоит по температуре. мне был важен один датчик. даже стало интересно, потом позже может и термостат управляемый прикручу.
кстати никто не подскажет - есть смысл на курсы С++ пойти дополнительно ко всему?
Хочется набраться знаний, а время идет... может кто ходил и есть свое мнение?
кстати никто не подскажет - есть смысл на курсы С++ пойти дополнительно ко всему?
Хочется набраться знаний, а время идет... может кто ходил и есть свое мнение?
За себя скажу: нет смысла. Достаточно нормальной книжки, бумажной. Того же Кернигана и Ритчи.
А ничего, что у Кернигана с Ритчи нет ни слова про С++?
А ничего, что у Кернигана с Ритчи нет ни слова про С++?
Это основы, без них никуда. Остальные плюшки - потом. Сами понимаете, что всё равно все уши растут из С.
Это не плюшки, это другой язык программирования.
Я не спорю, что без знания С в С++ делать нечего, но я не могу согласиться со словом "достаточно" в Вашем предыдущем посте.
Это не плюшки, это другой язык программирования.
Я не спорю, что без знания С в С++ делать нечего, но я не могу согласиться со словом "достаточно" в Вашем предыдущем посте.
Ок, поправлюсь: для начала - достаточно. Ибо всё равно - учиться всю жизнь. Но я бы поостерёгся прыгать через голову и хвататься сразу за всю специфику С++ - начинать надо, ИМХО, именно с упомянутой книги, остальное - приложится. Полемика ни о чём, К&Р - это библия, без неё никуда.
Да, забыл же ж совсем от склероза: Труп Страуса же: https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%D1%81%D1%82%D1%80%D0%B0%D1%83%D1%81%D1%82%D1%80%D1%83%D0%BF%20%D1%81%2B%2B
Но, опять же - лучше с Кернигана с брателлой начать.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Блин. Да поймите вы, что изучать сразу ООП без знания самых основ - это как раскурочить движок мерседеса кувалдой и удивляться, почему оно не собирается обратно. Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно. На этом дискуссию сворачиваю, каждый поступает так, как считает нужным.
Пацаны, флудить не зае....?
Пацаны, флудить не зае....?
Ещё вчера :)