Почистил скетч примера работы с DS18B20 из библы OneWire..

Solvi
Offline
Зарегистрирован: 28.03.2016

Помогите решить проблему со срывом синхронизации видеосигнала при выводе показаний температуры с помощью 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

Тапками не сильно бейте, я только учусь.

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

А без прерываний нормально выводит?

Solvi
Offline
Зарегистрирован: 28.03.2016

Да.

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

47 пост, функция на millis().

Solvi
Offline
Зарегистрирован: 28.03.2016

bwn пишет:

47 пост, функция на millis().

Подскажите пожалуйста как эту функцию привязать к моему примеру?

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

Объявляете глобально
массив адресов далласов: byte addr[2] [8] = {{xxx,xxx,xxx},{xxx,xxx,xxx}};
массив температур: float Temp[2];
переменную количества секунд: byte  flagDallRead;

В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.

Solvi
Offline
Зарегистрирован: 28.03.2016

bwn пишет:

Объявляете глобально
массив адресов далласов: byte addr[2] [8] = {{xxx,xxx,xxx},{xxx,xxx,xxx}};
массив температур: float Temp[2];
переменную количества секунд: byte  flagDallRead;

В сетапе остается ваш телевизор.
Там где в функции стоит for, изменяете параметры для количества ваших датчиков, в данном случае 2, у меня было для трех.
Вызов из loop по имени функции с параметром (flagDallRead*1000);
Там, где flagDallRead = 2; изменяете на количество секунд требуемое вам.

Спасибо за помощь, но не помогло - все равно срывает видео сигнал.

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

Скетч бы итоговый сбросили. А стандартный пример из OneWire так понимаю работает?

Solvi
Offline
Зарегистрирован: 28.03.2016

bwn пишет:

Скетч бы итоговый сбросили. А стандартный пример из 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; //Время возврата в секундах
      }
    }
  }
}

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

Стандартный пример работает ещё хуже.

 

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

Здесь не помогу((((. Думаю проц занят дольше, чем допустимо для обновления кадра. Попробуйте с одним датчиком.

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

TVout.h не юзал....
может быть в строке #32 добавить задержку на 40 mS ?

Solvi
Offline
Зарегистрирован: 28.03.2016

Нужно минимум два датчика.

Спасибо что потратили время.

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

Solvi пишет:

Нужно минимум два датчика.

Спасибо что потратили время.

Если с одним будет работать, можно будет функцию на два блока разбить.

Solvi
Offline
Зарегистрирован: 28.03.2016

bwn пишет:

Solvi пишет:

Нужно минимум два датчика.

Спасибо что потратили время.

Если с одним будет работать, можно будет функцию на два блока разбить.

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

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

Попробуйте ветку else вместо for разбить на еще один if-else по образу и подобию. Добавляется еще одна булева переменная, в зависимости от нее работаем с нулевым или первым датчиком.
Важно - flagDall должен инвертится в зависимости от второй булевой переменной, аналогично и переменная prevTime.
Если интервалы останутся как сейчас, можно сделать проще, просто разбить на if-else и добавить булеву переменную. После первой конвертации считается один датчик, после следующей второй.
 

P/S Еще немного времени сэкономите, если время возврата измените на миллисекунды и уберете операцию *1000.
Ну и на 16 делить уже в основном цикле.
Попробуйте пример Dimax модифицировать как выше написал, он еще быстрее должен работать.

rapidshe
Offline
Зарегистрирован: 31.12.2015

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 работает отлично( не считая что поначалу тоже идут нули), но не берусь его брать т.к. не могу понять вообще...(

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

Кроме 46 строки, i < 3, криминала не вижу. Вечером попробую запустить. Должно быть: в первую секунду нули, далее температура. Чтобы постоянно в монитор не долбило, принты лучше убрать в конец функции, но здесь от задачи зависит. У меня массив Temp[] создан для обработки в других функциях.
Если вам нужны постоянные небольшие интервалы, то  пример  Dimax удобнее. Я чаще использую двух-трехминутные и собаку держу на основной ее функции, поэтому millis().
Cам пример модифицирован полностью от Dimax, таймер заменил на millis(), а работают одинаково.

rapidshe
Offline
Зарегистрирован: 31.12.2015

bwn пишет:

Кроме 46 строки, i < 3, криминала не вижу.

тьфу... заработало, спасибо)

pavel1234
Offline
Зарегистрирован: 26.06.2016

dimax пишет:

А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)

#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-бит режиме. 

 

А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?

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

pavel1234 пишет:

  
 Автодетекта адреса ds18b20 нет, так что нужно адрес указать вручную. Работает в дефолтовом 9-бит режиме. 

А какая точность отображения измеряемой температуры будет на этом скетче? И как она меняется? Т.е. отображаются ли десятые доли градуса?

[/quote]

Переставив на 12бит, будет с шагом 0,0625гр. Как переставить, смотрите примеры ниже или описание.

KosteT
Offline
Зарегистрирован: 17.07.2016

bwn пишет:

alexvs пишет:

А если 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 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?

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

KosteT пишет:

Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?

В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.

KosteT
Offline
Зарегистрирован: 17.07.2016

bwn пишет:

KosteT пишет:

Подскажите, плз, в чем сокральный смысл 5 и 7 строк. В данном коде полагаю его нет ) Но не зря же он там появился - видимо юзается для опроса кучки датчиков?

В первый проход выполняется if, в следующий else.
В оригинале с WDT используется такой же принцип. Несколько датчиков это 17, 19 и 22 строки.

Ночь дело темное, правильно Вы говорили) Пропустил мимо ключевой слово static, именно оно не даёт уничтожить локальную переменную после цикла.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

dimax пишет:

А то уж больно захламлён, смотреть неприятно. И положил в прерывание вотчдога, егойный простецкий таймер в самый раз для таких дел :) Теперь всё компактно, наглядно и красиво :)

#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) ? какона работает, что значит указание в вкобках?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Short Circuit пишет:

и если не сложно ответить:  что значит магическая строка void setup(void) ? какона работает, что значит указание в вкобках?

Это к Ардуино никакого отношения не имеет. Это - Си. Читать: Керниган, Ритчи. Язык программирования Си.

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

Short Circuit пишет:

а как сделать с автодетектом?

В сетапе считать адреса, занести в массив или еепром, пользоваться.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

не, ну как не имеет, оно же   с ардуино так и работает.

я встречал - в приере  для датчика температуры, этот пример работает:

 

// 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);
}

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

bwn пишет:

Short Circuit пишет:

а как сделать с автодетектом?

В сетапе считать адреса, занести в массив или еепром, пользоваться.

пример выше - как быбез этого работает.

вот только я так понимаю настоятельно не рекомедуют использовать #include <DallasTemperature.h>

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

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

DT кому то нравится, кому то нет. Работает вполне корректно, только не уйти от задержки в 750мС + 2К программной памяти сжирает. Dimax считаю пошел по верному пути, прямо прописывая адреса для 1-2 датчиков. Смысл автодетекта только для серийного производства. ИМХО.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

долбаю вариант на 1-вайр - на 1 датчик без адреса 1820

вроде отчасти получается. но не понимаю - он тоже может тормозить программу?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

долбаю вариант на 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();

Тормозов - ноль.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Я СДЕЛАЛ ТАК:

 

#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;
}

потом в программе  всталяю значение:

sms_txt = sms_txt + "TEMPERATURA: " + String(getTemp()) + " C" + "\n"; delay(100);

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

код не мой. мне нужно было только на один датчик 1820

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

String  которую собрали из кусков  для отправки смс - поддерживает только 64 знака???

похоже на то.. :(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

String  которую собрали из кусков  для отправки смс - поддерживает только 64 знака???

похоже на то.. :(

Чой-то? Пока память не кончится, столько и будет в себе держать ;)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Short Circuit пишет:

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

Там буфер 64 байта. Честно говоря, не разбирался, как печатать длинные строки, но, вероятно, одним из двух путей:

- разбивать на кусочки, не превосходящие 64 байта,

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

Подумал: есть еще вариант - нельзя вносить изменения в строку до того, как она будет полностью отправлена.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

не хочется разбивать  на 64, смс можно 140 знаков посылать?

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

И эта смс  явно больше 64 знаков. А вот уже последующие смс по запросу - фиг, не хотят..

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

отослал строку sms_txt = sms_txt + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" + "\n"; delay(10);

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В чем проблема, я не знаю.

А насколько чаксты Вы передаете строки? Т.е. сколько времени проходит между двумя отправками?

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

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

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

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

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

кстати никто не подскажет - есть смысл на курсы С++ пойти дополнительно ко всему?

Хочется набраться знаний, а время идет... может кто ходил и есть свое мнение?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Short Circuit пишет:

кстати никто не подскажет - есть смысл на курсы С++ пойти дополнительно ко всему?

Хочется набраться знаний, а время идет... может кто ходил и есть свое мнение?

За себя скажу: нет смысла. Достаточно нормальной книжки, бумажной. Того же Кернигана и Ритчи.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А ничего, что у Кернигана с Ритчи нет ни слова про С++?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

А ничего, что у Кернигана с Ритчи нет ни слова про С++?

Это основы, без них никуда. Остальные плюшки - потом. Сами понимаете, что всё равно все уши растут из С.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это не плюшки, это другой язык программирования.

Я не спорю, что без знания С в С++ делать нечего, но я не могу согласиться со словом "достаточно" в Вашем предыдущем посте.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

Это не плюшки, это другой язык программирования.

Я не спорю, что без знания С в С++ делать нечего, но я не могу согласиться со словом "достаточно" в Вашем предыдущем посте.

Ок, поправлюсь: для начала - достаточно. Ибо всё равно - учиться всю жизнь. Но я бы поостерёгся прыгать через голову и хвататься сразу за всю специфику С++ - начинать надо, ИМХО, именно с упомянутой книги, остальное - приложится. Полемика ни о чём, К&Р - это библия, без неё никуда.

Да, забыл же ж совсем от склероза: Труп Страуса же: 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

Но, опять же - лучше с Кернигана с брателлой начать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

Для навчала - недостаточно. Ибо программирование в рамках концепции Ардуино основано на использовании библиотек, а библиотеки - на ООП. Поэтому без основ ООП (не обязательно Страуструпа) - никуда.

Блин. Да поймите вы, что изучать сразу ООП без знания самых основ - это как раскурочить движок мерседеса кувалдой и удивляться, почему оно не собирается обратно. Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно. На этом дискуссию сворачиваю, каждый поступает так, как считает нужным.

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

Пацаны, флудить не зае....?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

bwn пишет:

Пацаны, флудить не зае....?

Ещё вчера :)