Странное поведение переменных при замене циклов for оператором if
Посмотрите на изображение последовательного монитора, показывающее, что я получаю большое число, 4 миллиарда, когда я умножаю две вызванные функции вместе. Это всегда происходит после 53, если я изменяю сумму, на которую рассчитывает оператор if. Я последовательно отслеживал оператор if, и он считает до 600, затем вниз, затем вверх и повторяется хорошо, а значение датчика остается прежним.
Я избавляюсь от деления в y и помещаю все это в цикл for и все равно получаю большое число. Моя цель состоит в том, чтобы сгладить вывод и настроить аналоговую запись одновременно. Приспосабливается, но не тускнеет. Замена цикла for оператором if или вызов многих функций приводит к ошибке.
int аналогInPin = A0;
интервал аналогаOutPin3 = 3;
целое значение датчика;
интервал я = 0;
в а;
инт у;
void sens(int &sensorValue){
SensorValue = (((long)analogRead(analogInPin)*255)/1023);
}
пустота inOut(int &i){
если (i>-1){
я = я + а;
если (я == 0) {
а = 1;
}
если (я == 600) {
а = -1;
}
вернуть я;
}
}
недействительным updateFade () {
датчик(значение датчика);
входящий выход (я);
unsigned long y = ((sensorValue*i)/600);
Serial.println (значение датчика);
}
недействительная установка () {
Серийный.начать(9600);
pinMode(аналоговыйInPin,ВХОД);
pinMode(3,ВЫХОД);
}
недействительный цикл () {
обновитьFade();
delay(100);
аналоговая запись (3, у);
}

@northershoveler, 👍0
Обсуждение2 ответа
Вы определяете i,y,i как глобальные переменные, поэтому нет необходимости передавать их другим функциям. Доступ к ним и их изменение можно получить во всех частях вашей программы.
определить вместо
int y;
изменить на
long y;
и изменить
void inOut(int &i){
в
void inOut(){
и удалить
return i;// Это глобальная переменная
изменить строку
unsigned long y = ((sensorValue*i)/600);
в
y = ((sensorValue*i)/600);
Старайтесь не использовать одинаковые имена для глобальных и локальных переменных. Может случиться так, что компилятор обработает его как переопределение, что может привести к разного рода проблемам в сложных программах. (Также для вас, если вы посмотрите на плохо задокументированный код несколько месяцев спустя)
И избавьтесь от задержки, когда он прекращает обработку (также ваши подпрограммы) см. Blinkwithoutdelay, как сделать это правильно
ArduinoIDE->file-> примеры->2 Цифровой->Мигать без задержки
Спасибо за помощь, это мой рабочий код. Я изменил вещи на длинные, избавился от некоторых длинных, перестал передавать переменные и заставил число в sensorValue быть длинным. Теперь он считает вверх и вниз, если я устанавливал потенциометр каждую минуту.
int аналогInPin = A0;
интервал аналогаOutPin3 = 3;
длинное значение датчика;
интервал я = 0;
в а;
длинный у;
пустота чувств () {
SensorValue = ((analogRead(analogInPin)*255L)/1023); // заставить 255 быть длинным
}
недействительным inOut () {
если (i>-1){
я = я + а;
если (я == 0) {
а = 1;
}
если (я == 600) {
а = -1;
}
}
}
недействительным updateFade () {
чувств();
входящий();
y = ((значение датчика*i)/600);
Серийный.println(y);
}
недействительная установка () {
Серийный.начать(9600);
pinMode(аналоговыйInPin,ВХОД);
pinMode(3,ВЫХОД);
}
недействительный цикл () {
обновитьFade();
delay(100);
аналоговая запись (3, у);
}
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Получить массив символов с помощью модуля SIM900
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Чтение двоичного файла на SD-карте
- Проблемы с Serial.read()
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Термистор не работает
- Занимают ли комментарии место в скомпилированном скетче C++? Ардуино / узел микроконтроллера
Вошёл в неподписанный не идёт. Если
iравно -1, то каким будетy?, @Majenkoy всегда будет 0, потому что тот, который вычисляется внутри этой функции, является локальным для нее и умирает, когда функция завершается, так и не использованная. Таким образом, y, который используется в цикле AnalogWrite, всегда будет равен 0., @Delta_G
Если я могу сделать еще одно несвязанное предложение, ваша функция sens не должна принимать никаких параметров. Это может быть просто sens(). Поскольку SensorValue является глобальным, вы можете изменить его и получить к нему доступ из любой точки программы. Вам не нужно передавать это как аргумент. Вам нужна только вся передача по ссылке, если вы пытаетесь изменить локальные переменные в одной функции из другой функции. Но это не то, что вы здесь делаете. У вас есть глобальная переменная. То же самое с вашей функцией inOut. i является глобальным, поэтому вы можете просто использовать его. Вам не нужно передавать его по кругу., @Delta_G
это все одно и то же целое число .... двоичное
1111 1111 1111 1111 1111 1111 1100 1010== шестнадцатеричноеFFFFFFCA== **беззнаковое** десятичное4294967242== **знаковое** десятичное-54, @jsotola