Ви не увійшли.
Насколько Вам критична точность измерения напряжения? Вопрос не праздный, потому что увидел деление float на flot думаю что реальность в железе Вас сильно разочарует по сравнению с Протеусом. NoName железно прав в том что в МК нужно максимально избегать математических действий с float.
Неактивний
Насколько Вам критична точность измерения напряжения? Вопрос не праздный, потому что увидел деление float на flot думаю что реальность в железе Вас сильно разочарует по сравнению с Протеусом. NoName железно прав в том что в МК нужно максимально избегать математических действий с float.
в принципе +-0.2 вольта меня устроит, но если есть вариант лучше, то конечно было бы очень интересно посмотреть, делал по примерам, в программировании не селен
вы вот эту строку имели ввиду: voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024;
как правильно нужно ее сделать ?
Остання редакція ardnew (2016-03-03 21:58:45)
Неактивний
Например так:
int x = sum[l_cnt] * V_REF;
int y = 1024 *NUM_SAMPLES;
voltage[l_cnt] = (float) x / y;
Это я бы сказал вопрос не программирования а математики. И уберите те нули в V_REF и везде где они не значащие.
А вообщем из atmeg еще тот меритель .Но в такой точности вполне реально.
И последний вопрос, а реально компилировать вы программу пробовали?
P.S. Проверил компилируется .
Остання редакція Nefreemen (2016-03-04 00:07:39)
Неактивний
Например так:
int x = sum[l_cnt] * V_REF;
int y = 1024 *NUM_SAMPLES;
voltage[l_cnt] = (float) x / y;Это я бы сказал вопрос не программирования а математики. И уберите те нули в V_REF и везде где они не значащие.
А вообщем из atmeg еще тот меритель .Но в такой точности вполне реально.
И последний вопрос, а реально компилировать вы программу пробовали?
P.S. Проверил компилируется .
строку заменил, работает, и про нули, вы имеете ввиду 5 вместо 5.0 ?
Неактивний
все! эти три реле вынесли мне весь мозг! опять херня какая то!
сам код :
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)
Неактивний
стоп, не нужно мне приписывать любовь к 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)
Неактивний
NoName, чего с утра такое плохое настроение? О какой то любви .
А это даже я вообще не понял что Вы хотели сказать.
add
ardnew, вы для работы взяли понятный, но совсем правильный пример, у вас код не обвязан дебагом, вы просто не знаете что у вас происходит,
удачи в поиске глюков )
По дебагу понятно, что для новичка это просто необходимо. А про пример Вы о чем?
Неактивний
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 например
Неактивний
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, какое Ваше мнение, что если в том варианте что я предложил почистить буфер 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);
Я как то пишу по старинке ( не ленюсь ставить скобочки) .
if (str == "Rele 1") {
digitalWrite(led11, HIGH);
}
if (str == "Rele 2") {
digitalWrite(led12, HIGH);
}
if (str == "Rele 3") {
digitalWrite(led13, HIGH);
}
когда то в последовательности if пропустил случайно скобку. Потом парился с нарушением логики работы кода.
Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия с точки зрения синтаксиса.
Неактивний
правильно оформленный код, это хорошо )
if (... )
{
}
это правильно ), но не в этом случае
я всю сознательною жизнь воюю с асинхронными потоками, IR, UART это единственные каналы связи ) заморочки есть, с паузами между байтами,
разрывы, а бывает что и патеряшки ( затерявшийся в недрах сети пакет ) приходит, нужно правильно контролировать и собирать входящие данные
на выходных посмотрю библиотеку Serial.readBytes, но она мне уже не нравиться ) хотя если имеет 2 терминатора, время и длина данных, то пользоваться можно, но будут задержки как минимум в секунду (по дефолту)
Неактивний
Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия с точки зрения синтаксиса.
сейчас попробую и отпишусь.
Неактивний
Угу. Курим http://arduino.ua/ru/prog/If
Неактивний
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, я вам очень признателен за уделенное время и помощь !!!
Неактивний
if (str == "Rele 1") {
digitalWrite(led11, HIGH);
}
когда то в последовательности if пропустил случайно скобку. Потом парился с нарушением логики работы кода.
Я бы посоветовал ardnew попробовать такой вариант, чем Wirg не шутит ?
П.С. Посмотрите на эту последовательность if повнимательней чего то меня терзают смутные предчувствия с точки зрения синтаксиса.
фигурные скобки не помогли
Неактивний
ardnew, это код ( String str = Serial.readStringUntil('\n'); ) неправильный!
данный алгоритм тормозит основной поток!!! выбросьте этот вариант и никогда не пользуйтесь!
Остання редакція NoName (2016-03-04 12:09:55)
Неактивний
ardnew, это код ( String str = Serial.readStringUntil('\n'); ) неправильный!
данный алгоритм тормозит основной поток!!! выбросьте этот вариант и никогда не пользуйтесь!
ну вот, только обрадовался а как правильно ?
Неактивний
NoName, да эта функция выходит по таймауту, или по символу. Так что остается читать по байтно в Serial.available(), она вызывается автоматом и наверное привязана к прерыванию USART.
Неактивний