В сетапе остается ваш телевизор.
Там где в функции стоит 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.
#include <OneWire.h> #include <TVout.h> #include <fontALL.h> TVout TV; OneWire ds(2); byte addr1[8] = {0X28, 0X10, 0XDC, 0X20, 0X6, 0X0, 0X0, 0X9B}; byte addr2[8] = {0X28, 0X9B, 0XDF, 0X20, 0X6, 0X0, 0X0, 0XC7}; volatile int temp1, temp2; void setup(void) { TV.begin(_NTSC, 126, 71); TV.select_font(font6x8); TV.clear_screen(); WDTCSR = (1 << WDCE) | (1 << WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 4 секунда // (55 страница даташита) // снять все ремарки если нужно поменять разрешение ds.reset(); // сброс шины // ds.select(addr2); //выставить адрес // ds.write(0x4E); // разрешение записать конфиг // ds.write(0x7F); // Th контроль температуры макс 128грд // ds.write(0xFF); //Tl контроль температуры мин -128грд ds.write(0x3F); // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F } void loop(void) { TV.set_cursor(0, 37); TV.print("Temp1= "); TV.println(temp1 / 16.0); TV.set_pixel(100, 37, 1); TV.print(102, 37, "C"); TV.set_cursor(0, 54); TV.print("Temp2= "); TV.println(temp2 / 16.0); TV.set_pixel(100, 54, 1); TV.print(102, 54, "C"); TV.delay_frame(1); } ISR (WDT_vect) { //вектор прерывания WD static boolean n = 0; // флаг работы: запрос температуры или её чтение n = !n; if (n) { ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) } else { ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read() << 8); //прочитаны 2 байта // получение с 2-го датчика ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read() << 8); //прочитаны 2 байта } }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 так понимаю работает?
#include <OneWire.h> #include <TVout.h> #include <fontALL.h> TVout TV; OneWire ds(2); byte addr[2] [8] = {{0X28, 0X10, 0XDC, 0X20, 0X6, 0X0, 0X0, 0X9B}, {0X28, 0X9B, 0XDF, 0X20, 0X6, 0X0, 0X0, 0XC7}}; float Temp[2]; byte flagDallRead; void setup() { TV.begin(_NTSC, 126, 71); TV.select_font(font6x8); TV.clear_screen(); } void loop() { TV.set_cursor(0, 37); TV.print("Temp1= "); TV.println(Temp[0]); TV.set_pixel(100, 37, 1); TV.print(102, 37, "C"); TV.set_cursor(0, 54); TV.print("Temp2= "); TV.println(Temp[1]); TV.set_pixel(100, 54, 1); TV.print(102, 54, "C"); TV.delay_frame(1); dallRead(flagDallRead * 1000); } //***Функция считывания температуры 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 < 2; i++) { //Перебор количества датчиков ds.reset(); ds.select(addr[i]); ds.write(0xBE); //Считывание значения с датчика temp = (ds.read() | ds.read() << 8); //Принимаем два байта температуры Temp[i] = (float)temp / 16.0; flagDallRead = 2; //Время возврата в секундах } } } }Проблема в том, что во время обновления данных с термодатчика в видеосигнал подмешивается паразитный импульс.
Стандартный пример работает ещё хуже.
Здесь не помогу((((. Думаю проц занят дольше, чем допустимо для обновления кадра. Попробуйте с одним датчиком.
TVout.h не юзал....
может быть в строке #32 добавить задержку на 40 mS ?
Нужно минимум два датчика.
Спасибо что потратили время.
Нужно минимум два датчика.
Спасибо что потратили время.
Если с одним будет работать, можно будет функцию на два блока разбить.
Нужно минимум два датчика.
Спасибо что потратили время.
Если с одним будет работать, можно будет функцию на два блока разбить.
С одним срыв пропал, осталось подергивание экрана на пару пикселей вниз в момент опроса датчика.
Попробуйте ветку else вместо for разбить на еще один if-else по образу и подобию. Добавляется еще одна булева переменная, в зависимости от нее работаем с нулевым или первым датчиком.
Важно - flagDall должен инвертится в зависимости от второй булевой переменной, аналогично и переменная prevTime.
Если интервалы останутся как сейчас, можно сделать проще, просто разбить на if-else и добавить булеву переменную. После первой конвертации считается один датчик, после следующей второй.
P/S Еще немного времени сэкономите, если время возврата измените на миллисекунды и уберете операцию *1000.
Ну и на 16 делить уже в основном цикле.
Попробуйте пример Dimax модифицировать как выше написал, он еще быстрее должен работать.
bwn, что делаю не так?
сначала секунды 2 идут нули, потом секунды 2 идут показания всех трех датчиков, а потом нули до бесконечности...
#include <OneWire.h> OneWire ds(9); byte addr[3][8]={{0x28,0xBC,0x74,0x03,0x00,0x00,0x80,0x12},{0x28,0x63,0x8E,0x03,0x00,0x00,0x80,0xE9},{0x28,0x49,0x7A,0x03,0x00,0x00,0x80,0x29}}; //byte addr1[8]={0x28,0xBC,0x74,0x03,0x00,0x00,0x80,0x12}; //byte addr2[8]={0x28,0x63,0x8E,0x03,0x00,0x00,0x80,0xE9}; //byte addr3[8]={0x28,0x49,0x7A,0x03,0x00,0x00,0x80,0x29}; byte flagDallRead; float Temp[3]; void setup() { Serial.begin(9600); } void loop() { Serial.print("Temp1="); Serial.print(Temp[0]); Serial.print('\n'); Serial.print("Temp2="); Serial.print(Temp[1]); Serial.print('\n'); Serial.print("Temp3="); Serial.println(Temp[2]); Serial.print('\n'); dallRead(flagDallRead * 1000); } //***Функция считывания температуры 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 < 4; i++){ //Перебор количества датчиков ds.reset(); ds.select(addr[i]); ds.write(0xBE); //Считывание значения с датчика temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры Temp[i] = (float)temp / 16.0; flagDallRead = 2; //Время возврата в секундах } } } } //--------------------------------------------------Пример Dimax работает отлично( не считая что поначалу тоже идут нули), но не берусь его брать т.к. не могу понять вообще...(
Кроме 46 строки, i < 3, криминала не вижу. Вечером попробую запустить. Должно быть: в первую секунду нули, далее температура. Чтобы постоянно в монитор не долбило, принты лучше убрать в конец функции, но здесь от задачи зависит. У меня массив Temp[] создан для обработки в других функциях.
Если вам нужны постоянные небольшие интервалы, то пример Dimax удобнее. Я чаще использую двух-трехминутные и собаку держу на основной ее функции, поэтому millis().
Cам пример модифицирован полностью от Dimax, таймер заменил на millis(), а работают одинаково.
Кроме 46 строки, i < 3, криминала не вижу.
тьфу... заработало, спасибо)
А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)
#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-бит режиме.А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?
А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?
[/quote]
Переставив на 12бит, будет с шагом 0,0625гр. Как переставить, смотрите примеры ниже или описание.
А если 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) ? какона работает, что значит указание в вкобках?
и если не сложно ответить: что значит магическая строка 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 датчиков. Смысл автодетекта только для серийного производства. ИМХО.
долбаю вариант на 1-вайр - на 1 датчик без адреса 1820
вроде отчасти получается. но не понимаю - он тоже может тормозить программу?
долбаю вариант на 1-вайр - на 1 датчик без адреса 1820
вроде отчасти получается. но не понимаю - он тоже может тормозить программу?
Ни капли, от слова "вообще":
OneWire ow(pin); ow.write(0xCC); // пофиг на адреса (SKIP ROM) ow.write(0x44); // запускаем преобразование ow.reset(); ow.write(0xCC); // пофиг на адреса (SKIP ROM) ow.write(0xBE); // читаем scratchpad датчика на пине for(uint8_t i=0;i<9;i++) data[i] = ow.read();Тормозов - ноль.
Я СДЕЛАЛ ТАК:
#include <OneWire.h> OneWire ds(3); // вход датчика 18b20 float getTemp(){ // возвращает температуру с датчика byte data[12]; // и останавливает программу на секунду byte addr[8]; !ds.search(addr); ds.reset(); ds.select(addr); ds.write(0xBE); for (int i = 0; i < 9; i++) data[i] = ds.read(); int raw = (data[1] << 8) | data[0]; // Переводим в температуру if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6]; return raw / 16.0; }потом в программе всталяю значение:
как все это дело улучшить? подозревая есть куча ошибок, но работает.
код не мой. мне нужно было только на один датчик 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
Но, опять же - лучше с Кернигана с брателлой начать.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.
Блин. Да поймите вы, что изучать сразу ООП без знания самых основ - это как раскурочить движок мерседеса кувалдой и удивляться, почему оно не собирается обратно. Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно. На этом дискуссию сворачиваю, каждый поступает так, как считает нужным.
Пацаны, флудить не зае....?
Пацаны, флудить не зае....?
Ещё вчера :)