Тут к сожалению ничего посоветовать не могу, ардуино приобрел только полгода назад, программирование микроконтролеров еще недостаточно освоил, приходится много тратить времени на закрытие пробелов в электронике. В теории, я бы предпочел прерывания, программирование через delay, на мой взгляд, не очень смотрится.
Просто интересно, почему процедура сброса вынесена в отдельную функцию, а аналогичная установка индикатора в теле цикла?
А каким образом вы это сделаете?? И каким образом можно само вычисление температуры в функцию перевести??
Само вычисление не обязательно выносить, равно как и все остальное, хотя было бы читабельнее и изящнее. Но. Вы сделали функцию R, которая обнуляет индикатор, при этом аналогичный цикл с выставлением значения оставили в теле. Было бы логично вынести его тоже в функции. Кстати, конструкция с while, на мой взгляд локаничнее. Код (Text): while (Т--) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); }
Так же как функцию R. Только она без входа и без выхода, но несложно сделать какие угодно параметры. Опять же выносить часть кода в функцию есть смысл при повторе, например последовательная подача на пин LOW и HIGH (повторяется в программе в двух местах). В качестве входящего параметра - номер пина. Пример универсальной функции подачи вкл-выкл на пин: Код (Text): void R(int PIN) { digitalWrite(PIN, HIGH); digitalWrite(PIN, LOW); }
Код (Text): #include <math.h> #define TERMIST_B 4300 #define VIN 5.0 #define RESET_PIN 6 #define CLOCK_PIN 7 #define RDip 8 #define LDip 9 void R() { digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } void D (int x){ while(x--) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); } } void T(int y){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; y = round(temperature); } void setup() { Serial.begin(9600); pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LDip, OUTPUT); pinMode(RDip, OUTPUT); } void loop() { float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; int T0 = round(temperature); // D(T0); int T1 = 0; T(T1); delay(1000); R(); int T2 = 0; T(T2); if (T1 = T2){ digitalWrite(LDip , HIGH); digitalWrite(RDip , HIGH); } else if (T1 > T2) { digitalWrite(RDip , HIGH); digitalWrite(LDip , LOW); } else if (T1 < T2) { digitalWrite(LDip , HIGH); digitalWrite(RDip , LOW); } }
Код (Text): #include <math.h> #define TERMIST_B 4300 #define VIN 5.0 #define RESET_PIN 6 #define CLOCK_PIN 7 #define RDip 8 #define LDip 9 int var = 0; void R() { digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } void D (int x){ while(var < x) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); var++; } } void T(int y){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; y = round(temperature); } void setup() { Serial.begin(9600); pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LDip, OUTPUT); pinMode(RDip, OUTPUT); } void loop() { float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; int T0 = round(temperature); int T1 = 0; T(T1); D(T1); delay(1000); R(); int T2 = 0; T(T2); D(T2); if (T1 = T2){ digitalWrite(LDip , HIGH); digitalWrite(RDip , HIGH); } else if (T1 > T2) { digitalWrite(RDip , HIGH); digitalWrite(LDip , LOW); } else if (T1 < T2) { digitalWrite(LDip , HIGH); digitalWrite(RDip , LOW); } } Не работает, спасайте((((
void T(int y){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; y = round(temperature); Где то тут ошибка не могу понять(( Определил через монитор порта
Дело в том, что в языке C/C++, значения параметров функции в самой функции нельзя поменять. В данном случае самый простой выход возвращать результат через return. Код (Text): int T() { float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; return round(temperature); } Ну и соответственно в коде поправить: Код (Text): int T1 = T(); int T2 = T();
А если воспользоваться параметрами по ссылке? Код (Text): void T(int &y){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; y = round(temperature); } Или указателем? Код (Text): void T(int *y){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; *y = round(temperature); } Во втором случае вызывать так (передавать параметром не переменную, а ее адрес): Код (Text): int T1 = 0; T(&T1); // передаем адрес переменной Хотя в данном конкретном случае возвращать через return в любом случае логичнее.
Код (Text): #include <math.h> #define TERMIST_B 4300 #define VIN 5.0 #define RESET_PIN 6 #define CLOCK_PIN 7 #define RDip 8 #define LDip 9 int var = 0; void R() { digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } void D (int x){ while(var < x) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); var++; } } int T (){ float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; Serial.println(temperature); return round(temperature); } void setup() { Serial.begin(9600); pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LDip, OUTPUT); pinMode(RDip, OUTPUT); } void loop() { int T1 = T(); Serial.print(T1); D(T1); delay(1000); R(); int T2 = T(); Serial.println(T2); D(T2); if (T1 = T2){ digitalWrite(LDip , HIGH); digitalWrite(RDip , HIGH); } else if (T1 > T2) { digitalWrite(RDip , HIGH); digitalWrite(LDip , LOW); } else if (T1 < T2) { digitalWrite(LDip , HIGH); digitalWrite(RDip , LOW); } } Теперь не выводит данные на 7ми сегментник
Потому что функция D работает неправильно. Переменная var должна обнуляться в начале цикла, т.к. после него она становится равной x и это значение сохраняется между вызовами функции D. А лучше ее вообще не использовать, как предлагал выше DrProg. Кстати, еще одна ошибка: Код (Text): if (T1 = T2){ Это условие будет выполняться всегда, кроме случая, когда T2 = 0. Потому что оператор = это не проверка на равенство, а присвоение переменной T1 значения T2. Правильно писать: Код (Text): if (T1 == T2) {
Хммм... Сейчас выводит число 52 и тд. Измерив температуру оказалось что она 26, а 26*2=52, интересно наверное я что то упустил((