#51 2016-03-03 21:21:20

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

Насколько Вам критична точность измерения напряжения? Вопрос не праздный, потому что увидел деление float на flot думаю что реальность в железе Вас сильно разочарует по сравнению с Протеусом. NoName железно прав в том что в МК нужно максимально избегать математических действий с float.

Неактивний

#52 2016-03-03 21:39:33

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Насколько Вам критична точность измерения напряжения? Вопрос не праздный, потому что увидел деление float на flot думаю что реальность в железе Вас сильно разочарует по сравнению с Протеусом. NoName железно прав в том что в МК нужно максимально избегать математических действий с float.

в принципе +-0.2 вольта меня устроит, но если есть вариант лучше, то конечно было бы очень интересно посмотреть, делал по примерам, в программировании не селен sad

вы вот эту строку имели ввиду:   voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024;
как правильно нужно ее сделать ?

Остання редакція ardnew (2016-03-03 21:58:45)

Неактивний

#53 2016-03-03 23:47:22

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

Например так:
       int x = sum[l_cnt] * V_REF;
       int y =  1024 *NUM_SAMPLES;
       voltage[l_cnt] = (float) x / y;

Это я бы сказал вопрос не программирования а математики. И уберите те нули в  V_REF и везде где они не значащие.
А вообщем из atmeg еще тот меритель big_smile .Но в такой точности вполне реально.
И последний вопрос, а реально компилировать вы программу пробовали? roll
P.S. Проверил компилируется  smile .

Остання редакція Nefreemen (2016-03-04 00:07:39)

Неактивний

#54 2016-03-04 09:33:24

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Например так:
       int x = sum[l_cnt] * V_REF;
       int y =  1024 *NUM_SAMPLES;
       voltage[l_cnt] = (float) x / y;

Это я бы сказал вопрос не программирования а математики. И уберите те нули в  V_REF и везде где они не значащие.
А вообщем из atmeg еще тот меритель big_smile .Но в такой точности вполне реально.
И последний вопрос, а реально компилировать вы программу пробовали? roll
P.S. Проверил компилируется  smile .

строку заменил, работает, и про нули, вы имеете ввиду 5 вместо 5.0 ?

Неактивний

#55 2016-03-04 10:42:30

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

все! эти три реле вынесли мне весь мозг! опять херня какая то!
сам код :

void loop()
{   
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    if (str == "Rele 11") digitalWrite(led11, LOW);
    if (str == "Rele 22") digitalWrite(led12, LOW);
    if (str == "Rele 33") digitalWrite(led13, LOW);
    }
}

включаю по очереди все три реле, включаются, выключаю по очереди все три реле, выключаются, все, затем не могу включить не одно реле!
или, включаю реле 1, включается, выключаю реле 1, выключается, и опять не могу включить не одно реле!
что опять не так ?

Остання редакція ardnew (2016-03-04 10:49:46)

Неактивний

#56 2016-03-04 10:56:43

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

стоп, не нужно  мне приписывать любовь к String)  штука удобная, но не в  контроллере )
я вообще в буфер что то типа такого пишу
uart2.buffer[uart2.length%sizeof(uart2.buffer)] = UART_RX;
add
uart2.length ++;
if ( uart2.length >= sizeof(uart2.buffer) )  { warning  message }
%)
а стринги ( да и иные труселя в контроллере зло )
вылет за пределы памяти, это тоже вселенское зло ) пишите сразу с защитами

add
ardnew,  вы для работы взяли понятный, но совсем правильный пример, у вас  код не обвязан  дебагом, вы просто не знаете что у вас происходит, 
удачи в поиске глюков )

Остання редакція NoName (2016-03-04 11:03:56)

Неактивний

#57 2016-03-04 11:14:14

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

NoName, чего с утра такое плохое настроение? О какой то любви big_smile .

А это даже я вообще не понял что Вы хотели сказать.
add
ardnew,  вы для работы взяли понятный, но совсем правильный пример, у вас  код не обвязан  дебагом, вы просто не знаете что у вас происходит, 
удачи в поиске глюков )

По дебагу понятно, что для новичка это просто необходимо. А про пример Вы о чем?

Неактивний

#58 2016-03-04 11:22:36

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

так делать то что ?

Неактивний

#59 2016-03-04 11:30:16

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

void loop()
{   
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    if (str == "Rele 11") digitalWrite(led11, LOW);
    if (str == "Rele 22") digitalWrite(led12, LOW);
    if (str == "Rele 33") digitalWrite(led13, LOW);
    }
}

симпатичный пример, абсолютно все понятно, но не правильно!  )  если идет речь о асинхронном потоке
кто то попробовал вариант  с отсечкой данных до пробела?
чем хорош ардуино, так это красота скетча , 3 строчки и все работает )  плюсы  (С++) относительно редко используются для разработки

этот пример тоже хорош, но проверять строки нужно только по получению футера, \r\n например

Неактивний

#60 2016-03-04 11:33:06

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:

этот пример тоже хорош, но проверять строки нужно только по получению футера, \r\n например

эх.. если бы еще понять о чем вы говорите sad

Неактивний

#61 2016-03-04 11:36:49

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

void loop()
{   
      if (Serial.available() > 0)
  {
    // Serial.readBytes( input, 20 );
    String str = Serial.readStringUntil('\n');
    // String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    if (str == "Rele 11") digitalWrite(led11, LOW);
    if (str == "Rele 22") digitalWrite(led12, LOW);
    if (str == "Rele 33") digitalWrite(led13, LOW);
    Serial.println (str) ;
}
}

возможно так
а чем управляющие команды передаете? с терминалки или есть некий софт?

Неактивний

#62 2016-03-04 11:40:38

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

NoName, какое Ваше мнение, что если в том варианте что я предложил почистить буфер input и Sting? Но откуда эти глюки? Может проблема в этом:

    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    if (str == "Rele 11") digitalWrite(led11, LOW);
    if (str == "Rele 22") digitalWrite(led12, LOW);
Я как то пишу по старинке ( не ленюсь ставить скобочки) lol .

   if (str == "Rele 1") {
      digitalWrite(led11, HIGH);
   }
   if (str == "Rele 2") {
      digitalWrite(led12, HIGH);
   }
   if (str == "Rele 3") {
      digitalWrite(led13, HIGH);
   }
когда то  в последовательности if пропустил случайно скобку. Потом парился с нарушением логики работы кода.
Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит  big_smile ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия roll с точки зрения синтаксиса.

Неактивний

#63 2016-03-04 11:51:13

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

правильно оформленный код, это хорошо )

if (... )
{

}
это правильно ), но не в этом случае
я всю сознательною жизнь воюю с асинхронными потоками, IR, UART  это единственные  каналы связи ) заморочки есть, с паузами между байтами,
разрывы, а бывает что и патеряшки ( затерявшийся в недрах  сети пакет ) приходит,  нужно правильно контролировать и собирать входящие данные 
на выходных посмотрю библиотеку Serial.readBytes, но она мне уже не нравиться ) хотя если имеет 2 терминатора, время и длина данных, то пользоваться можно, но будут задержки как минимум в  секунду (по дефолту)

Неактивний

#64 2016-03-04 11:52:35

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:

возможно так
а чем управляющие команды передаете? с терминалки или есть некий софт?

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

Неактивний

#65 2016-03-04 11:53:42

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит  big_smile ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия roll с точки зрения синтаксиса.

сейчас попробую и отпишусь.

Неактивний

#66 2016-03-04 11:54:09

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

программа закрывает данные  или так и шлет "rele 1"  или так "rele 1\r\n" "rele 1\n"

Неактивний

#67 2016-03-04 11:58:03

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

Угу. Курим http://arduino.ua/ru/prog/If

Неактивний

#68 2016-03-04 12:06:22

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:
void loop()
{   
      if (Serial.available() > 0)
  {
    // Serial.readBytes( input, 20 );
    String str = Serial.readStringUntil('\n');
    // String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    if (str == "Rele 11") digitalWrite(led11, LOW);
    if (str == "Rele 22") digitalWrite(led12, LOW);
    if (str == "Rele 33") digitalWrite(led13, LOW);
    Serial.println (str) ;
}
}

возможно так
а чем управляющие команды передаете? с терминалки или есть некий софт?

ДА! этот код работает так как нужно, и с терминала и с программы !!!
NoName, я вам очень признателен за уделенное время и помощь !!!

Неактивний

#69 2016-03-04 12:07:48

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

   if (str == "Rele 1") {
      digitalWrite(led11, HIGH);
   }
когда то  в последовательности if пропустил случайно скобку. Потом парился с нарушением логики работы кода.
Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит  big_smile ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия roll с точки зрения синтаксиса.

фигурные скобки не помогли sad

Неактивний

#70 2016-03-04 12:09:15

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

ardnew, это код (  String str = Serial.readStringUntil('\n'); ) неправильный!
данный алгоритм  тормозит  основной поток!!!  выбросьте этот вариант и никогда не пользуйтесь!

Остання редакція NoName (2016-03-04 12:09:55)

Неактивний

#71 2016-03-04 12:12:33

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

ardnew, если работает Serial.readStringUntil('\n'), не забудьте выбросить массив char[], пусть не болтается  big_smile .

Неактивний

#72 2016-03-04 12:18:37

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

ну ладно текущий вопрос закрыли
что будем делать с правильной работой с uart?
откроем новую тему или тут продолжим )
и кто будет проверять? у меня нету ардуино )

Неактивний

#73 2016-03-04 12:19:48

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:

ardnew, это код (  String str = Serial.readStringUntil('\n'); ) неправильный!
данный алгоритм  тормозит  основной поток!!!  выбросьте этот вариант и никогда не пользуйтесь!

ну вот, только обрадовался sad  а как правильно ?

Неактивний

#74 2016-03-04 12:19:50

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

NoName, да эта функция выходит по таймауту, или по символу. Так что остается читать по байтно в Serial.available(), она вызывается автоматом и наверное привязана к прерыванию USART.

Неактивний

#75 2016-03-04 12:23:18

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

ardnew, если работает Serial.readStringUntil('\n'), не забудьте выбросить массив char[], пусть не болтается  big_smile .

да, убрал все лишние.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму