Помогите написать простой скетч

Leha37
Offline
Зарегистрирован: 27.05.2019

Добрый день. с Ардуино и програмированием я совсем новичек. Нужна помощь.

Чтобы не сидеть с паяльником и не собирать схему на транзисторах, а заодно немного начать осваивать Arduino, решил воспользоваться Arduino. Но посидев поразбиравшись понял что написать скетч даже такой просто не под силу. Смысл такой:

На аналоговый вход подается плавно напряжение от 5 до 0V в сторону уменьшения. Плата Ардуино должна дублировать входное напряжение, на выходе выдавать то же что и на входе, но с одним условием, если напряжение на входе становится меньше 0,9V то на выходе из ардуино оно должно остаться на границе 0,9v и не становится меньше при уменьшении напряжения на входе.

Смысл такой, обмануть ЭБУ-автомобиля а именно сигнал с датчика температуры чтобы, компьютер видел температуру только до заданного порога и не видел дальнейшее повышение 

sadman41
Offline
Зарегистрирован: 19.10.2016

1) Что Вы вкладываете в термин "помочь" в данном случае?
2) "Плата Ардуино" не умеет выдавать напряжение.

vvadim
Offline
Зарегистрирован: 23.05.2012

для вашей ситуации есть раздел ищу исполнителя.

на этом форуме за так помогают только тем, кто сам что то делает.

Green
Offline
Зарегистрирован: 01.10.2015

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да, нужен цап,скетч получится несложный, тот же MCP4725

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы взял PCF8591 - дёшево и сердито.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Достаточно будет простого RC фильтра. Алчные жлобы. 

int datchik;
void setup()
{

}
void loop()
{
  datchik=analogRead(A0);
  if (datchik<184) analogWrite(9,46);
  else analogWrite(9,datchik/4);
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

anatoli_nik пишет:

Достаточно будет простого RC фильтра. Алчные жлобы. 

int datchik;
void setup()
{

}
void loop()
{
  datchik=analogRead(A0);
  if (datchik<184) analogWrite(9,46);
  else analogWrite(9,datchik/4);
}

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

Green
Offline
Зарегистрирован: 01.10.2015

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Как мне помнится по форуму: как только в требованиях появляется слово "автомобиль"  - начинается геморрой с АЦП и все эти конструкции с analogRead(), отлично работавшие на столе, мгновенно превращаются в тыкву.

T.Rook
Offline
Зарегистрирован: 05.03.2016

[оффтоп]

Leha37 пишет:

... если напряжение на входе становится меньше 0,9V то на выходе из ардуино оно должно остаться на границе 0,9v и не становится меньше при уменьшении напряжения на входе.

Если я правильно пониманию задачу, то это два диода и источник 0,9В. Точно хотите уйти в "цифровой повторитель" ?

[/оффтоп]

Tolyan24
Offline
Зарегистрирован: 24.04.2019

все ок, спасибо

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а зачем тут вообще ардуина и транзисторы!! 

тут вообще достаточно 2 резистора в качестве делителя на 0.9В

если больше 0.9 - то убедт данные исходящего сигнала, если меньше - делитель подтянет вверх...

ну можно дополнить схему еще стабилитроном, дабы только при меньше 0.9в включался делитель...

SLKH
Offline
Зарегистрирован: 17.08.2015

Green пишет:

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

условие, можно сказать, есть.

"Помогите написать скетч" - там всей программы на 3 строки.

В автомобиле работать не будет  - см. #9

SLKH
Offline
Зарегистрирован: 17.08.2015

anatoli_nik пишет:

Достаточно будет простого RC фильтра. Алчные жлобы. 

int datchik;
void setup()
{

}
void loop()
{
  datchik=analogRead(A0);
  if (datchik<184) analogWrite(9,46);
  else analogWrite(9,datchik/4);
}

analogWrite(pwmPin, constrain(analogRead(analogPin), 184, 1023)/4);

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

ПротеВус показывает пульсации менее 10мВ на выходе.

int datchik;
const float k = 0.01;
int filter(int input){
  static float y = 0;
  static float z = 0;
  z += input - y;
  return y = k * z;
}
void setup()
{

}
void loop()
{
  datchik=analogRead(A0);
    datchik = filter(datchik);
  if (datchik<184) analogWrite(9,46);
  else analogWrite(9,datchik/4);
}

 

kim84sm
Offline
Зарегистрирован: 28.05.2019

   Ребят, такой вопрос - в Ардуино возвожно одной строкой Serial.print() вывесте в com порт СРАЗУ ВСЕ компоненты структуры, особенно это касаетя прописных строк? Что-то типа 

          struct Date

         { int day;

            char month[];

            int year; };

          ..................

             Date VictoryDay = {9, 'May', 1945};

             Serial.begin(9600);

             Serial.print(VictoryDay);

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

kim84sm пишет:

   Ребят, такой вопрос - в Ардуино возвожно одной строкой Serial.print() вывесте в com порт СРАЗУ ВСЕ компоненты структуры, особенно это касаетя прописных строк? Что-то типа 

          struct Date

         { int day;

            char month[];

            int year; };

          ..................

             Date VictoryDay = {9, 'May', 1945};

             Serial.begin(9600);

             Serial.print(VictoryDay);

Как вариант - определить для структуры operator String() и внутри форматировать содержимое в строку. Про операторы можно почитать в справочнике языка.

kim84sm
Offline
Зарегистрирован: 28.05.2019

 Спасибо за ответ.Правильно  понимаю - внутри структуры создать конструктор String(), и внутри него создавать как члены String, так и int? В моём случае достаточно, чтобы по нажатию кнопки выводилась конкретная дата(лишь бы месяц был словом).   Может быть, более правильно не заморачиватья со структурой, а прописать всё в String()? 

   Мне нужно, чтобы при выводе в COM порт после одной ссылки в Serial.print() выводилось число, слово и число. Структура в простом виде этого сделать не могут.

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

Не конструктор, а оператор, член-функция с прототипом:

operator String()
{
  String result;
  // тут форматируем в result
  return result;
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan пишет:

Не конструктор, а оператор, член-функция с прототипом:

operator String()
{
  String result;
  // тут форматируем в result
  return result;
}

 

Ох, утечёт память, чую.  

ПыСы, а хотя нет, наерна, у String копирующий конструктор правильно написан. 

kim84sm
Offline
Зарегистрирован: 28.05.2019

  Ребят, не найти нормального объяснения, как определить для структуры operator String(), и вообще о самом этом члене-функции почти ничего. Может ткнёте в хорошее чтиво?

   Там как, внутри струкруры прописать opetator String(), а в теле члена-функции String() {} как то 'сколотить' строку. А уже в void setup()  через Serial.print() выводить собранную строку??? или не правильно...помогите двоишнику?

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

DetSimen пишет:

DIYMan пишет:

Не конструктор, а оператор, член-функция с прототипом:

operator String()
{
  String result;
  // тут форматируем в result
  return result;
}

 

Ох, утечёт память, чую.  

ПыСы, а хотя нет, наерна, у String копирующий конструктор правильно написан. 

С чего бы это ей течь? Всё нормально с классом String, всё там нормально реализовано.

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

kim84sm пишет:

  Ребят, не найти нормального объяснения, как определить для структуры operator String(), и вообще о самом этом члене-функции почти ничего. Может ткнёте в хорошее чтиво?

   Там как, внутри струкруры прописать opetator String(), а в теле члена-функции String() {} как то 'сколотить' строку. А уже в void setup()  через Serial.print() выводить собранную строку??? или не правильно...помогите двоишнику?

А что непонятного?

struct Some
{
  int i;
  byte b;
  
  operator String()
  {
    String result;
    result = F("i=");
    result += i;
    result += F("; b=");
    result += b;
    
    return result;
  }
};

void setup() 
{
  Serial.begin(57600);

  Some some;
  some.i = 10;
  some.b = 20;

  Serial.println(some);

}

void loop() 
{

}

Вот и весь пример.

kim84sm
Offline
Зарегистрирован: 28.05.2019

Спасибо Вам большое! Нужную надпись сделал, но, не всё понятно: (на примере Вашего кода), переменные some.i и   some.b я могу менять с входов или подключенной к ардуинке панели.Но, как быть с тем, что в кавычках (" ")?  Как менять текст, не трогая код?

   И, хотел спросить, где можно почитать про член-функцию String() {} ?  Это СИшный синтаксис, так собирать строки?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

видимо вводить переменную

b707
Offline
Зарегистрирован: 26.05.2017

kim84sm пишет:

 как быть с тем, что в кавычках (" ")?  Как менять текст, не трогая код?

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

kim84sm
Offline
Зарегистрирован: 28.05.2019

   Учебников великая тьма. Подскажите, что лучше почитать, применительно к членам-функциям внутри структур для Ардуино. Прошу прощения за назойливость! )))