Автоматизация оборотов хх на карбюраторных авто

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

Ну не хотите апроксимацией мозг хмурить. Могу понять. Но "табличные значения", почему не сделать массивом?

Красивей было-бы сделать массив структур, но не хочу усложнять пример

Где-то вверху скетча (или даже вынести в отдельный .h файл что-бы "настраивать" было удобней).

#define TEMPS_COUNT sizeof(temps)/sizeof(byte) // мне лень руками считать сколько элементов у меня в массиве
// наши диапазоны и углы
byte temps[]=              {10,11, 12, 13, 14,15}; // если градусы идут по порядку и с одинаковым шагом, тот даже без этого массива можно обойстись
byte angles[TEMPS_COUNT-1]={90,95,100,105,110};

И потом где-то в Loop()

for(byte i=0;i<TEMPS_COUNT-1;i++){
   if(tempC>=temps[i] && tempC<temps[i+]){
     Servo.write(angles[i]);
     break; // зачем нам дальше что-то проверять если мы уже нашли угл?
   }
 }

Неужели это намного сложней чем 100-раз делать copy-paste (который потом еще и поправить нужно)?

leshak
Offline
Зарегистрирован: 29.09.2011

renoshnik пишет:

 проще контролировать обороты

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

astral0
Offline
Зарегистрирован: 26.03.2013

Да бог с вами, какая пропаганда, я никого не учу говнокоду, я просто хочу поэкспериментировать! Какие заказчики? Мне просто интересно, как это будет работать! Я ничего продавать не собираюсь. А если вдруг соберусь - тогда, разумеется, буду писать прогу с заделом на будущее, именно как вы описали, гибким, легко модифицируемым кодом. Я знаю, что такое "допиливание" кода и как важна изначальная правильная структура программы для лёгкой ей модификации в будущем.

У меня не укладывается в голове, что вы делаете в этой ветке? Вы действительно не можете написать простейшую программу для своей цели?

 

leshak
Offline
Зарегистрирован: 29.09.2011

astral0 пишет:

Да бог с вами, какая пропаганда, я никого не учу говнокоду, я просто хочу поэкспериментировать!

Ну когда я предложил вариант "как можно свернуть код", а вы начали рассказывать что "так быстродействие лучше", "так проще" и т.п. и.д. Я воспринял это именно как пропаганду что "так тоже можно писать". Поэтому попытался дать альтернативную точки зрения: не проще, не быстрее, не производительнее.

astral0 пишет:

Какие заказчики? Мне просто интересно, как это будет работать! Я ничего продавать не собираюсь.

Понятие "заказчик" - мне просто привычней мыслить в таких терминах. Даже когда  я делаю "для себя" я просто выступаю в роли и "заказчика" и "исполнителя" одновременно. Тут заказчик имелся ввиду даже скорее "тот кто ставит задачу". И даже если я ставлю ее сам, то... это не значит что сегодня знаю что мне потребуется завтра. 

Поэтому изменения предполагаются ВСЕГДА.

astral0 пишет:

А если вдруг соберусь - тогда, разумеется, буду писать прогу с заделом на будущее, именно как вы описали, гибким, легко модифицируемым кодом.

Как правило это не вопрос "решения", а вопрос "привычки". Стиля. Когда начинать писать "легко модифицируемый".
Я лично, просто на автомате когда вижу дублирование кода сразу начинаю думать "как бы его порефакторить". Даже когда он чужой. Даже когда об этом никто не просит :)  Это уже безусловный рефлекс ;)

astral0 пишет:

У меня не укладывается в голове, что вы делаете в этой ветке? Вы действительно не можете написать простейшую программу для своей цели?

Кто не может? Я не могу написать программу для своей цели? Хм... с чего вы это взяли?

astral0
Offline
Зарегистрирован: 26.03.2013

За последнее извините, перепутал вас с другим участником)

В любом случае спасибо за советы, буду иметь в виду) 

По поводу ровного количества градусов - не будет такого, при прогреве движка увеличение температуры идет такими темпами, что ни о каком "дрожании" вокруг целого числа нет и речи. Проскочит за долю секунды.

gaara
Offline
Зарегистрирован: 26.03.2014

Обороты не проще и не нужно, потому как у меня они на подсосе более 2000 не поднимаются, так настроенно специально, потому от температуры будет сделанно правельнее, я не програмист, и меня тут коментарии в конец запутали :) как я говорил, мне нужно простейщее, при такой то температуре такой то угол, вот и всё)))

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

 и меня тут коментарии в конец запутали :) 

Ну а как вы хотели? На то он и форум. Если "готовое под ключ", так это в раздел "ищу исполнителя", а тут естественно велики шансы на обсуждение :)   (даже в "ищу исполнителя" и то регулярно разгараются баталии "как лучше").

Можно подомать вы в гаражах никогда машину не чинили когда вокруг собирается 15-ть советчиков и каждый имеет свой взгляд "как лучше делать". На яме, на эстакаде или просто "подлезть". Могут еще и подратся между собой. И все из благих намерений...

Если нужно, дык мы (по крайней мере я) можем развести "дисскусию" как лучше писать "uint8_t somevar;" или "byte somevar;" на две страницы. Хотя, с точки зрения компилятора - это одно и то же ;)

Запутались в комментах - так смотрите код. Он первоисточник :) Код - это как раз и есть специальный язык. Который позволяет описывать какие-то действия четко и однозначно. Исключить "двоякие толкования". И в отличае от английского и русского, словарь этого языка - пара десятков слов. А грамматика - десяток конструкций простейших ;)

А примеров кода, для вашей задачи - всего два. И оба делают одно и тоже ;) То что вы просили :)

gaara
Offline
Зарегистрирован: 26.03.2014

Нее, у меня в гараже такого нету))) я мотомеханик, не получается, чтобы мне кто то советовал)))

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

Нее, у меня в гараже такого нету))) я мотомеханик, не получается, чтобы мне кто то советовал)))

Ну значит вам не попадались такие как я ;)  Я первый раз увидев как картошку выкапывают. Люди которые в селе живут с рождения. Через час не выдержал и "начал оптимизировать процесс". Кстати дело пошло быстрее на 58%. Я секундомером замерял время обработки "одного рядка" ;) 

Уверен на 90% что и вам бы нашел что "насоветовать". При этом воспользовавшись вашими же специализированными знаниями ;)

Ну а уж "о чем поспорить" найти, так это вообще 110% уверен ;)

astral0
Offline
Зарегистрирован: 26.03.2013

gaara пишет:

Обороты не проще и не нужно, потому как у меня они на подсосе более 2000 не поднимаются, так настроенно специально, потому от температуры будет сделанно правельнее, я не програмист, и меня тут коментарии в конец запутали :) как я говорил, мне нужно простейщее, при такой то температуре такой то угол, вот и всё)))

Строго по твоему вопросу. Первое, что нужно сделать - найти (купить) и подключить температурный датчик (например, по ссылке выше, тупо копируем код http://zelectro.com.ua/dallas-18b20), то есть реально получать с него данные в окне serial. Подключить серву к подсосу, отрегулировать полноту хода заслонки. Добавить в начало кода инициализацию сервы и переменную, скажем, RealAngle, в конце - вывод в serial текущего положения сервы, примерно так:

servo.read(RealAngle);
Serial.print("Текущий угол сервы = ");
Serial.print(RealAngle);

Цикл обновлять, скажем, раз в десять секунд. Запустить холодный двигатель и программу. Прогревая двигатель, экспериментально рукой выставлять серву в нужное положение. Таким образом, увидим в окне serial необходимое соответствие значений температура/угол. Составляем таблицу.

Ну а далее уже, как говорится, финишная прямая) Берём полученную таблицу, по ней либо апроксимируем математическую функцию, либо тупо забиваем прямое соответствие при помощи if, как я писал выше. Всё.
Да, и ещё. убедись, что серва может поворачивать заслонку без значительных усилий, а то будет не так точно выставлять угол. Впрочем, для твоей задачи это большой роли не играет.

При наличии результатов выкладывай фото/видео отчёты и код, будем вместе править)

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

astral0 пишет:

 Прогревая двигатель, экспериментально рукой выставлять серву в нужное положение.

А потом серва говорит "хр...." и имеет выщербленные шестеренки (на опыте так говорю. 30-ть раз все было хорошо, а на 31-первый получил "блин.... убил серву").

Поэтому лучше


void loop(){
  if(Serial.available()){
     if(Serial.read()=='s'){
         
         byte angle=Serial.parseInt();
         
         // говорим что сейчас будем делать
         Serial.print("New angle=");
         Serial.println(angle); 
         
         // делаем
         Servo1.write(angle); // читаем нужный угол из сериал и ставим в него серву
         
         while(Serial.available())Serial.read(); // очищаем входной буфер
     }
  }
}

Потом открываем Serial монитор. Выставляем Line endging в любом значение кроме "No line ending".

Набираем, скажем "s45" и жмем кнопку Send. Смотрим как серва сама поворачивается в положение 45-ть  (я же говорил что програмер должен быть ленивым. Пусть сама крутится :) Есть так для здоровья полезней.

leshak
Offline
Зарегистрирован: 29.09.2011

astral0 пишет:

servo.read(RealAngle);

Ну не могу не поехидничать:

Функция servo.read() не принимает ни одного параметра. Если верить документации. Так что, как минимум

RealAngle=servo.read()

Во вторых, а какой телепатией servo.read() сможет узнать текущий угол сервы если вы ее рукой крутили? Стандартная серва ведь не имеет канала обратной связи. У нее три провода. Питание, земля и УПРАВЛЯЮЩИЙ сигнал. Все.

leshak
Offline
Зарегистрирован: 29.09.2011

А в целом, astral0, приблизительный "план действий" верно описал в #60. Вернул, так сказать, из теоретических облаков, в практическое русло :)

P.S. Но естествено я не согласен что "тупо забиваем прямое соответствие при помощи if, как я писал выше". Я голосую за "тупо забиваем в массив", как я показал в #51

gaara
Offline
Зарегистрирован: 26.03.2014

и так я примерно понял, что делать, начну потихоньку писать, теперь к самой железке, для этих целей пойдёт такая вот штука? http://www.ebay.com/itm/Mini-USB-Nano-V3-0-ATmega328-5V-16M-Micro-contro...

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

и так я примерно понял, что делать, начну потихоньку писать, теперь к самой железке, для этих целей пойдёт такая вот штука? http://www.ebay.com/itm/Mini-USB-Nano-V3-0-ATmega328-5V-16M-Micro-controller-board-Arduino-compatible-/261423334857?pt=LH_DefaultDomain_0&hash=item3cde0b85c9

То что доктор прописал. Подойдет.

gaara
Offline
Зарегистрирован: 26.03.2014
astral0
Offline
Зарегистрирован: 26.03.2013

leshak пишет:

astral0 пишет:

 Прогревая двигатель, экспериментально рукой выставлять серву в нужное положение.

А потом серва говорит "хр...." и имеет выщербленные шестеренки (на опыте так говорю. 30-ть раз все было хорошо, а на 31-первый получил "блин.... убил серву").

Поэтому лучше






void loop(){
  if(Serial.available()){
     if(Serial.read()=='s'){
         
         byte angle=Serial.parseInt();
         
         // говорим что сейчас будем делать
         Serial.print("New angle=");
         Serial.println(angle); 
         
         // делаем
         Servo1.write(angle); // читаем нужный угол из сериал и ставим в него серву
         
         while(Serial.available())Serial.read(); // очищаем входной буфер
     }
  }
}

Потом открываем Serial монитор. Выставляем Line endging в любом значение кроме "No line ending".

Набираем, скажем "s45" и жмем кнопку Send. Смотрим как серва сама поворачивается в положение 45-ть  (я же говорил что програмер должен быть ленивым. Пусть сама крутится :) Есть так для здоровья полезней.

Вы думаете, новичок, не умеющий особо программировать, в этом разберётся? Сильно сомневаюсь. И ничего серве не будет от вращения руками, если резко не дёргать. Хотя, всё же, это действительно не лучший способ при подключенной к МК серве, она ведь будет выставлена в нулевое положение и будет его удерживать. Поэтому предлагаю другой, колхозный способ:
Нарисовать на маленькой бумажке угловую шкалу сервы, прилепить к серве, откалибровать ноль, и выставленные руками значения смотреть глазами и ручками записать в таблицу (серву при этом не подключать!). Может, это кошмар перфекциониста, но зато просто и наглядно для новичка) И точность достаточная для текущей задачи.
Заранее печатаем таблицу градусов (скажем, шкалу от -20 до 80) и, прогревая движок, каждые 10-20с правим руками серву и сразу записываем угол в таблицу, напротив текущей температуры, отображаемой в serial на ноутбуке.

astral0
Offline
Зарегистрирован: 26.03.2013

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

leshak
Offline
Зарегистрирован: 29.09.2011

astral0 пишет:

Вы думаете, новичок, не умеющий особо программировать, в этом разберётся? Сильно сомневаюсь.

Ну надо же с чем-то разбиратся. Вначале с блинком, потом построчно разбирать примеры. Если что-то не понятно - смотреть в докуемнтацию.

К тому же я дал готовый кусок кода. Который можно copy-paste и пользоватся для выставления угла сервы.

(кстати, избегайте использовать русский текст в Serial.println у стандартного Serial монитора с ним будут большие проблемы. И вообще, руский текст в скетчах - хороший способ выстрелить себе в ногу. Даже в коментах и то бывают проблемы с энкодингом).

А вообще, нужно начинать не с лазания под капот. А с покупки ЛЮБОЙ ардуину. Мигания диодом. Потом погонять примеры из библиотеки сервы. Научится ее просто крутить. Потом посмотреть примеры работы с Serial. Освоится, так сказать, с "запчастями".

И уж потом, только "лепить из этого решение". Если по отдельности разоблись и с Serial и сервой, то понять мой кусок кода уже не будет так "не под силу". Ну а как иначе?  Работа с микроконтроллером подразумевает понимание, а не "вот магия которая работает".

> И ничего серве не будет от вращения руками, если резко не дёргать.

Я не теоретически говорию. А практически. Я одну серву ЛИЧНО так сломал. И резкие рывки мне не потребовались. Все зависит от качества сервы. И парочка знакомых жаловалась на то же самое.

 

astral0
Offline
Зарегистрирован: 26.03.2013

leshak пишет:

А вообще, нужно начинать не с лазания под капот. А с покупки ЛЮБОЙ ардуину. Мигания диодом. Потом погонять примеры из библиотеки сервы. Научится ее просто крутить. Потом посмотреть примеры работы с Serial. Освоится, так сказать, с "запчастями".

Да, с этим согласен

По поводу сервы - я говорю про новые сервы, а не изношенные. Не должны новые ломаться. У меня за 9 лет авиамоделизма от воздействия руками ни одна не сломалась (может повезло)

leshak
Offline
Зарегистрирован: 29.09.2011

astral0 пишет:

leshak пишет:

А вообще, нужно начинать не с лазания под капот. А с покупки ЛЮБОЙ ардуину. Мигания диодом. Потом погонять примеры из библиотеки сервы. Научится ее просто крутить. Потом посмотреть примеры работы с Serial. Освоится, так сказать, с "запчастями".

Да, с этим согласен

Ну вот видите, все таки существуют вопросы в которых мы можем прийти к общему мнению :)

astral0 пишет:

По поводу сервы - я говорю про новые сервы, а не изношенные. Не должны новые ломаться. У меня за 9 лет авиамоделизма от воздействия руками ни одна не сломалась (может повезло)

Ну может мне не повезло с сервой. Может просто "в руках все ломается...". Только обжегшись на молоке - дую на воду. Руками больше не кручу. Накидать скетчик - минута дела. Да и руками выставить серву с точностью 3-5-ть градусов, лично я не могу (не знаю, может кто-то и может). А монстрячить к ней транспортир.... потом опять-таки "аккуратно дозировать усилие"... не, не мое это :)  Serial.parseInt() - мне как-то проще ;)

gaara
Offline
Зарегистрирован: 26.03.2014

что я делаю не так

 

#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC; //текущая температура
int val; //угол поворота мотора
int val_old; //старый угол поворота мотора
Servo myservo; //серво привод

void setup() {
sensors.begin();
myservo.attach(3,2540,640);//устанавливаем пин управления servo/устанавливаем границы поворота сервы
val_old=-100;
}

void loop() {
if (digitalRead(1)==HIGH){
sensors.requestTemperatures();
tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика

if (tempC > 10 && tempC < 11) { servo.write(90) };

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

что я делаю не так

Для начала код вставляете не читабельно. не читаете прикрепленные ветки:Вставка программного кода в тему/комментарий

leshak
Offline
Зарегистрирован: 29.09.2011

Во вторых - вы не описали "а что вы хотели сделать". В третих... при аттаче сервы, вы тайминги переставили местами. Вначале дожена идти длина импульса для нуля градусов (640), а уж потом для 180-ти (2540).

В третьих.. не понятно зачем вы все это обернули в if (digitalRead(1)==HIGH){, что у вас висит на этом пине?  Вернее не важно, на D1 ничего не должно висеть, потому что он используется для Serial. (общение с компом). Так что выбирайте другой пин, кроме D0,D1

В четвертых у вас не закрыта фигурная дужка к IF и loop(),  (по паскалевски: У вас BEGIN-нов больше чем END-дов).

 

gaara
Offline
Зарегистрирован: 26.03.2014
#include <Servo.h> 
#include <OneWire.h> 

OneWire dc(10); // Датчик температуры
Servo myservo;  // объект для управления сервомашинкой
 

float tempC;//текущая температура
int pos = 0;    // для хранения позиции 
 
void setup() 
{ 
  myservo.attach(7);  // управляющий провод сервы подключён к 7 порту
} 
 
 
void loop(){ 
if (digitalRead(1)==HIGH){
sensors.requestTemperatures();
tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика
{if (tempC > 10 && tempC < 11) { servo.write(90) };

 

gaara
Offline
Зарегистрирован: 26.03.2014

правельно пока делаю? я тут немного поменял ВСЁ)))) это составной код из нескольких, по этому укажите пожалуйста, что добавить, потому как понимаю. что не описал, что привод по каким углам должен ходить, так как не понимаю где именно это писать))

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

правельно пока делаю?

Неправильно. Почему опять у вас чтение D1? Во первых зачем? Во вторых... ну я уже описавал почему нельзя D1.

gaara пишет:
потому как понимаю. что не описал, что привод по каким углам должен ходить, так как не понимаю где именно это писать))

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

Ну и со скобками, у вас опять что-то не то. Пересчитайте их количество. И не нужно их лепить "лишь бы куда". Логика их размещения в точности совпадает с логикой BEGIN/END в паскале.

И "правильно ли их поставили". Их количество... это вам и ардуиноИДЕ может сказать. Без помощи форума. Просто пытаетесь скомпилить, а оно вам кричит ошибку. И иногда подсказывает где именно.

leshak
Offline
Зарегистрирован: 29.09.2011

А вообще начните, с того, что возмите пример датчика... и выведите его в Serial монитор. Убедитесь что он вообще работает, правильно подключен и т.п. А то вы сразу начали "части лепить вместе", не оттестировав их по отдельности. Вообщем идти по плану который вам обрисовал atra0. А не "прыгать через ступеньки".

gaara
Offline
Зарегистрирован: 26.03.2014

на руках железа нету пока, по этому писать про тест нет смысла, и очень большая путанница, у меня голова уже побаливать начинает, занимаюсь всем на работе, а тут сами понимаете, постоянный рёв стоит, из-за этого приходиться прыгать,

#include <Servo.h>
#include <OneWire.h>

OneWire dc(10); // Датчик температуры
Servo myservo;  // объект для управления сервомашинкой
  
 
float tempC;//текущая температура
int pos = 0;    // для хранения позиции
  
void setup()
{
  myservo.attach(7);  // управляющий провод сервы подключён к 7 порту
}
  
  
void loop(){
if (digitalRead(9)==HIGH){
sensors.requestTemperatures();
tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика
{if (tempC > 10 && tempC < 11) { servo.write(90);
}}}}

не уверен, что датчик температуры описал правельно, и как написать то, чтобы он проверял температуру каждую минуту  и после определённой температуры схема вообще отключалась и не включалась до той поры пока я опять зажигание не выключу\включу

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

на руках железа нету пока, по этому писать про тест нет смысла,

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

А при большои желании и в симуляторе можно поигратся (хотя кончено "Это не то" по ощущениям).

В том же http://studio.virtualbreadboard.com/ или протеусе.... (если поиском полазите по форуму, то обсуждались они уже...)

leshak
Offline
Зарегистрирован: 29.09.2011

Ну и оступы, переносы строк... вот в этих "}}}}" поробуй разобрася что к чему относится :(

А вот так:

#include <Servo.h>
#include <OneWire.h>

OneWire dc(10); // Датчик температуры
Servo myservo;  // объект для управления сервомашинкой


float tempC;//текущая температура
int pos = 0;    // для хранения позиции

void setup()
{
  myservo.attach(7);  // управляющий провод сервы подключён к 7 порту
}


void loop(){
  if (digitalRead(9)==HIGH){
    sensors.requestTemperatures();
    tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика
    {
      if (tempC > 10 && tempC < 11) {  servo.write(90);}
    }
  }
}

Сразу видно, что какая открывающая, какой закрывающей соотвествует. При этом видно, что сам if непонятно зачем обернут парой скобок. Не мешает конечно, но и смысла в них нет.

Ну а если попытатся компильнуть, то IDE сразу скажет, что не понимает что такое "sensors". Нигде не объявлен. Значит нужно смотреть/гуглить примеры работы имено с DS18b20.  Благо их валом.

gaara
Offline
Зарегистрирован: 26.03.2014

Как раз этим и занимаюсь :)

astral0
Offline
Зарегистрирован: 26.03.2013

gaara пишет:

Как раз этим и занимаюсь :)

А ты уже заказал себе датчик температуры?

gaara
Offline
Зарегистрирован: 26.03.2014

да, заказал

astral0
Offline
Зарегистрирован: 26.03.2013

ds18b20?

gaara
Offline
Зарегистрирован: 26.03.2014

да, именно он

gaara
Offline
Зарегистрирован: 26.03.2014
#include <Servo.h>
#include <OneWire.h>// Инициализация библиотеки шины OneWire.
#include <DallasTemperature.h>// Инициализация библиотеки термодатчиков.

#define ONE_WIRE_BUS 10// Подключение цифрового вывода датчика к 10-му пину Ардуино.

OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств.
 DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от  Dallas Temperature.
Servo myservo; // привод

void setup(void){
  myservo.attach(11);// привод на 11 порт.
sensors.begin();} // Запуск сенсора.

void loop(void){
sensors.requestTemperatures(); // Команда опроса температуры.
delay(200);
if(sensors.getTempCByIndex(0)>31){myservo.write(90);} //Если температура больше заданной серво в 90
else{myservo.write(20);}}// Если меньше - в 20.

 

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

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну беглый взгляд - все нормально.  (ну если не считать оформление кода: отступы и т.п. :)

Но было-бы не плохое, еще какой-нибудь Serial.println() воткнуть. С выводом текущей температуры. Вам же в любом случае захочется как-то увидеть какую-же температуру намерял датчик :)

gaara
Offline
Зарегистрирован: 26.03.2014

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

leshak
Offline
Зарегистрирован: 29.09.2011

gaara пишет:

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

На дисплей - это потом. Усложнить всегда успеете. А Serial.println - он завсегда под рукой. Это первое стредство отладки, выяснений "что же там происходит и т.п.". Дисплей мигнул и ушел в историю. А сериал монитор - copy-paste и сохранил в файлик. А потом сиди неспеша репу чухай. Смотри что там происходило, строй графики в эксельке и т.п.

Вообщем дисплей это не "вместо", а "дополнительная опция". Все всегда начинается с Serial.begin() :)

gaara
Offline
Зарегистрирован: 26.03.2014
#include <Servo.h>
#include <OneWire.h>// Инициализация библиотеки шины OneWire.
#include <DallasTemperature.h>// Инициализация библиотеки термодатчиков.

#define ONE_WIRE_BUS 10// Подключение цифрового вывода датчика к 10-му пину Ардуино.

OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств.
 DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от  Dallas Temperature.
Servo myservo; // привод

void setup(void){
  myservo.attach(11);// привод на 11 порт.
Serial.begin(9600);// Запуск СОМ порта.
sensors.begin();} // Запуск сенсора.

void loop(void){
sensors.requestTemperatures(); // Команда опроса температуры.
Serial.print("T0=");
Serial.println(sensors.getTempCByIndex(0)); // Печать в порт температуры
delay(200);
if(sensors.getTempCByIndex(0)>45){myservo.write(0);} //Если температура больше заданной серво в 0
if(sensors.getTempCByIndex(0)<30){myservo.write(90);} //Если температура меньше заданной серво в 90
if(sensors.getTempCByIndex(0)>35){myservo.write(45);}}//Если температура больше заданной серво в 45

в итоге, получилось следующие, если, что не так прошу меня поправить

renoshnik
Онлайн
Зарегистрирован: 11.04.2013

leshak пишет:

renoshnik пишет:

 проще контролировать обороты

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

 

LM2917 поможет избавиться от камней :) мне помогло...

gaara
Offline
Зарегистрирован: 26.03.2014

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

leshak
Offline
Зарегистрирован: 29.09.2011

Ну вроде верно. Можно конечно улучшать :) (это всегда можно делать).

Первое что я бы изменил: завел переменную куда читал-бы температуру. Обозвал-бы ее как-то покороче. В неебы делал getTempCByIndex один раз, а дальше пользовался этой переменной.

Второе: завел бы еще одну переменую. Для угла. А во всех этих IF-ха, не сразу серву выставлял, а вначали в эту переменнуюп исал  и 

if(.....){angle=45;}

И после всех IF-вов. У меня был-бы

myservo.write(angle)

В одном месте.

Кстати я бы туда сразу и Serial.println воткнул. Что-бы тестить можно было даже когда сервы под руками нет (например взяли плату и ушли домой тестить). ДА и просто видеть в логе точно какой градус решили ставить наши IF-ы.

Но это все... уже не принципиально. Эти поправки не относятся к "нужно обязательно сделать". 

P.S. И привыкайте к нормальному форматированию кода. Пока он маленький - еще термипо. А когда разрастется... ну банально будет лениво вглядываться/вчитываться где какая скобочка и т.п. Не знаю как другие, а я многие темы где код вставлен не как код, где полный винигрет и copy-past-а на 10-ть страниц одного и того же - зачастую тупо игнорю. Зачем тратить время? Ну не хочет человек облегчить другим жизнь, ну и фиг с ним.

gaara
Offline
Зарегистрирован: 26.03.2014

я так понимаю ты уже делал подобное, поделись пожалуйста кодом )))) если не жалко))))

leshak
Offline
Зарегистрирован: 29.09.2011

renoshnik пишет:

LM2917 поможет избавиться от камней :) мне помогло...

Сильно сомневаюсь (применительно к своей задаче, в вопросе подсоса - вполне возможно).  
Во первых мне нужна точность измерения +-5 оборотов (максимум 10ть, но это уже плохо), в диапазоне  от 1500 до 10000. При "импульсы на оборот" от 2-х до 60-ти :)

Даже если этот LM2917 вообще не имеет погрешности - ее имеет аналоговый вход дуины. Во первых разрешение 10-ть бит. Значит, в лучшем случае через аналог мы сможем заметить разницу в 20000/1024 = 10 об.м. Что уже "на грани допустимого". А так как еще и сам вход шумит, на 2-3 "попугая", то имеем погрешность 30-40 об. Плюс возврастает требовательность к качеству питания. Плюс сам LM - таки даст какую-то помеху. И это все при "2 импульса на оборот". При большем количестве - неточность будет еще выше.

И еще... мне крайне важна НАДЕЖНОСТЬ. Каждая лишняя деталька, каждый лишний проводок/соединение - крайней нежалательны.

gaara
Offline
Зарегистрирован: 26.03.2014

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

gaara
Offline
Зарегистрирован: 26.03.2014
Serial.println(rpm, DEC); // об/мин
  int sensorValue = digitalRead(RPMpin);
  if (digitalRead(RPMpin)>1000){myservo.write(0);}

я в правельном направлении ищу?

leshak
Offline
Зарегистрирован: 29.09.2011

В правильном... только почему digitalRead()? Он всегда возвращает либо 0 либо 1. Больше ничего. Смотрите какие еще есть функции для для чтения АНАЛОГОВЫХ пинов.

Во вторых, если вы прочитали уже значение сенсора в переменную sensorValue. Так и используйте ее в дальнейшем, зачем опять, в IF повторно читать пин?

astral0
Offline
Зарегистрирован: 26.03.2013

gaara пишет:

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

Это команда if {}, ваша третья строка