Есть идеи, почему мой светодиод не работает с оператором if

Я попробовал несколько обходных путей, но безуспешно.

#include <LiquidCrystal.h>
float tempC;
int tempPin = 0;// BS E D4 D5 D6 D7
int buzzer = 4;
int LED =2;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
unsigned char i;
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Temp        C ");
pinMode(LED, OUTPUT);
pinMode(buzzer,OUTPUT);//инициализируем вывод зуммера как выход
}
void loop()
{
tempC = getTemperature();
lcd.setCursor(6, 0); // Отображение температуры в градусах Цельсия
lcd.print(tempC);
delay(500);
}
float getTemperature()
{
int tempReading = analogRead(tempPin); // Хорошо
double tempK = log(1000000.0 * ((1024.0 / tempReading - 1)));
//Температура в Кельвинах
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );
return (tempK - 273.15);

if (tempC>0)
digitalWrite(LED,HIGH);
else
digitalWrite(LED, LOW);
}

, 👍1

Обсуждение

две возможные причины... 1. светодиод подключен неправильно и он не горит, что бы вы ни делали... 2. оператор if дает результат, который не включает светодиод, @jsotola

Я отредактировал ваш вопрос и использовал кнопку {} для форматирования кода, но в вашем коде нет отступов. Вам необходимо отредактировать свой код, чтобы использовать правильные отступы. Без этого читать очень тяжело., @Duncan C

Ваш код для просмотра температуры испорчен. У вас есть глобальная переменная tempC. Функция getTemperature() не меняет значение tempC, но использует его, чтобы решить, должен ли светодиод гореть или нет. Это означает, что эта функция примет решение на основе предыдущего значения tempC., @Duncan C

Вам следует переписать функцию getTemperature(), чтобы поместить температуру Цельсия во временную переменную, использовать ее, чтобы решить, что делать со светодиодом, а затем вернуть временное значение. Таким образом, getTemperature() будет устанавливать светодиод на основе только что рассчитанного значения температуры, а не на старом, уже устаревшем показании температуры., @Duncan C

Также обратите внимание, что если tempReading равен 0, ваш код выйдет из строя с ошибкой деления на ноль. Вам следует добавить код обработки ошибок, чтобы справиться с этим случаем., @Duncan C


1 ответ


Лучший ответ:

0

Светодиод не работает с оператором if, поскольку вызывается оператор return Завершает функцию и возвращает значение из функции вызывающей функции, если это необходимо. Попробуйте свой скетч с оператором return как «последним» в функции.

#include <LiquidCrystal.h>

float tempC;
int tempPin = 0; // БС Е D4 D5 D6 D7
int buzzer = 4;
int LED = 2;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
unsigned char i;

void setup() { 
  lcd.begin(16, 2); 
  lcd.setCursor(0, 0); 
  lcd.print("Temp C "); 
  pinMode(LED, OUTPUT); 
  pinMode(buzzer,OUTPUT);//инициализируем вывод зуммера как выход
} 

void loop() { 
  tempC = getTemperature(); 
  lcd.setCursor(6, 0); // Отображение температуры в градусах Цельсия
  lcd.print(tempC); 
  delay(500); 
} 

float getTemperature() { 
  int tempReading = analogRead(tempPin); // Хорошо
  double tempK = log(1000000.0 * ((1024.0 / tempReading - 1))); //Температура в Кельвинах
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); 
  if (tempC>0) digitalWrite(LED,HIGH); else digitalWrite(LED, LOW); 
  return (tempK - 273.15);
}
,

Если это исправление кода не работает, я предлагаю вам написать эскиз, который заставляет светодиод подниматься на высокий уровень, задерживает, переводит его на низкий уровень, задерживает и зацикливает. Посмотрите, мигает ли светодиод. Если нет, то у вас аппаратная проблема с проводкой светодиода. если это работает, значит, у вас возникла проблема со считыванием показаний датчика температуры, и вам необходимо отладить эту часть вашего проекта., @Duncan C

Благодарю за помощь и ответы. Похоже, у меня какая-то физическая проблема. Мой светодиод заработал после небольшого смещения макета. Значение моей температуры постоянно спорадически колеблется, и нагрев моего термистора не приводит к изменениям отображаемого значения температуры. Однако светодиод загорается, когда значения превышают предельное значение, что означает, что код в порядке. еще раз спасибо, @Dermaine Whittaker

Спасибо, Дункан. Вы мне очень помогли, и мне определенно предстоит многому научиться, и я с нетерпением жду этого :), @Dermaine Whittaker

Одна из проблем создания проектов Arduino заключается в том, что вам приходится отлаживать аппаратные и программные проблемы. Работайте поэтапно. Подключите светодиод, напишите скетч, который включает и выключает выходной контакт по таймеру, и убедитесь, что он работает. После этого вы знаете, что светодиод работает. Затем интегрируйте этот рабочий вывод светодиода в свой код, и если код не работает, вы знаете, что это проблема кода, а не аппаратная проблема. Если вы получаете неверные результаты из своего кода, добавьте несколько операторов Serial.println(), отображающих значения по мере продвижения, пока не найдете свою проблему., @Duncan C