Выход линейного потенциометра микроконтроллера

Хорошо, следующий вопрос: если я добавлю кнопку нажатия на цифровой вход, смогу ли я использовать ее для калибровки потенциометров на ноль?

При этом, когда я нажимаю кнопку, все значения начинаются с нуля, независимо от того, в каком положении находятся горшки? Я собирался сделать это в Excel позже, однако, кажется, можно попытаться сегодня днем. Будете ли вы использовать оператор switch или какой-либо оператор if?

float ZPot = 0;
float YPot = 1;
float XPot = 2;
byte Reset = 10;

void setup()
{
    pinMode(XPot, INPUT);
    pinMode(YPot, INPUT);
    pinMode(ZPot, INPUT);
    pinMode(Reset, INPUT);

    Serial.begin(9600);
}

void loop()
{
    ZPot = analogRead(0)/ 1023.0 * 105.0;
    YPot = analogRead(1)/ 1023.0 * 105.0;
    XPot = analogRead(2)/ 1023.0 * 105.0;
    Reset = digitalRead(10);

    Serial.print("X Pot [mm] = ");
    Serial.print(XPot    );
    delay(500);

    Serial.print("   Y Pot [mm] = ");
    Serial.print(YPot    );
    delay(500);

    Serial.print("   Z Pot [mm] = ");
    Serial.println (ZPot  );
    delay(500);
}

person Alex    schedule 13.04.2011    source источник
comment
Пожалуйста, создайте еще один вопрос, не редактируйте старые, в результате большинство комментариев будут бессмысленными...   -  person Bruno Rohée    schedule 13.04.2011
comment
Алекс, я обновил свое решение, включив в него калибровку. Обратите внимание, что я изменил Reset на int, а не на byte.   -  person Vladislav Zorov    schedule 14.04.2011


Ответы (3)


Вы уже почти там. Вам нужно изменить только две вещи:

float ZPot = 0;           
float YPot = 1;          
float XPot = 2;
int Reset = 10;
float ZCalibration = 0;
float YCalibration = 0;
float XCalibration = 0;

и

Reset = digitalRead(10);
ZPot = (analogRead(0) / 1023.0 * 105.0) - ZCalibration;
YPot = (analogRead(1) / 1023.0 * 105.0) - YCalibration;
XPot = (analogRead(2) / 1023.0 * 105.0) - XCalibration;

if (Reset == HIGH) {
    ZCalibration = ZPot;
    YCalibration = YPot;
    XCalibration = XPot;
}
person Vladislav Zorov    schedule 13.04.2011
comment
При этом первое изменение не будет иметь никакого значения в нормальной работе, но это хороший стиль для инициализации до 0 или -1, чтобы вы знали, когда что-то пошло не так с AnalogRead. Если от этой программы зависит чья-то жизнь, пожалуйста, доверьте ее профессионалу, так как необходимо выполнить множество проверок. - person Vladislav Zorov; 13.04.2011
comment
Спасибо, я сначала попробовал второй, так как это было быстрее всего. Добавление /1023.0*105.0; до конца аналоговое чтение работает. Однако изменение значений с плавающей запятой не работает. Поплавки должны быть установлены на аналоговые входы 1,2 и 3. Я попробую первое решение сегодня вечером. - person Alex; 13.04.2011
comment
Я имею в виду присваивания прямо в начале кода, который вы разместили - там вы просто устанавливаете переменные в их начальные значения (до первого чтения). Это не должно иметь никакого значения для AnalogRead, поскольку оно все равно заменит эти значения. Спасибо, что приняли ответ :) - person Vladislav Zorov; 13.04.2011
comment
Спасибо за вашу помощь, и не волнуйтесь, этот код не угрожает чьей-либо жизни, я буду использовать потенциометры на низкоуровневом гоночном автомобиле, чтобы попытаться записать, движется ли передняя подвеска по сравнению с рулевым колесом, я затем использовали Iphone с двумя приложениями для регистрации данных, чтобы записывать ускорение по трем осям, а также: скорость, пройденное расстояние и позицию, чтобы попытаться лучше понять, как автомобиль ведет себя во время поворота. - person Alex; 13.04.2011
comment
Вау, это звучит потрясающе! Радоваться, веселиться :) - person Vladislav Zorov; 13.04.2011

Попробуйте добавить функцию

float convertToMM(float reading)
{
  return reading/1023.0*105.0;
}

И затем, когда вы читаете вместо этого

ZPot = convertToMM(analogRead(0));
person Bruno Rohée    schedule 13.04.2011

Чтобы добавить ответы, вы также можете использовать функцию map():

ZPot = map(analogRead(0),0,1023.0,0,105);
YPot = map(analogRead(1),0,1023.0,0,105);
XPot = map(analogRead(2),0,1023.0,0,105);

Возможно, будет быстрее выполнить ручную операцию, а не вызывать map(), но если ваша программа не очень сложна, это должно подойти. В противном случае вы можете написать выражение (analogRead(0) / 1023.0f * 105.0f), используя только умножения: (analogRead(0) * 0.000977517107f * 105.0f)

ХТН

person George Profenza    schedule 13.04.2011
comment
Хорошо, следующий вопрос: если я добавлю кнопку нажатия на цифровой вход, смогу ли я использовать ее для калибровки потенциометров на ноль? При этом, когда я нажимаю кнопку, все значения начинаются с нуля, независимо от того, в каком положении находятся горшки? Я собирался сделать это в Excel позже, однако кажется возможным попытаться сегодня днем. Будете ли вы использовать оператор switch или какой-либо оператор if? - person Alex; 13.04.2011
comment
@Alex Алекс Я немного смущен, потому что вы постоянно присваиваете значения XPot, Ypot, Zpot через AnalogRead(). Если у вас есть кнопка, вы можете сбросить значения до 0, но в следующем цикле значения будут обновлены. Вы хотите установить пользовательские значения XPot, YPot, ZPot при нажатии кнопки и значения AnalogRead при отпускании кнопки? или использовать кнопку для переключения между предустановленными значениями и значениями AnalogRead? Боюсь, я не совсем понимаю, чего вы пытаетесь достичь. - person George Profenza; 13.04.2011