От processing отказался, подключил 7ми сегментник, то есть вывожу температуру с термистора на этот самый элемент, да не получается. Вот код Код (Text): #include <math.h> #define TERMIST_B 4300 #define VIN 5.0 #define CLOCK_PIN 7 #define RESET_PIN 6 void R() { digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } void setup() { Serial.begin(9600); pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, 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 T = round(temperature); Serial.println("."); Serial.print(T); R(); int var = 0; while (var < T ){ digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); var = var++; } }
А где в коде работа с семисегментником? Я вижу вкл и тутже выкл одного пина несколько раз и все. Как подключен индикатор? Через регистр? Да, и пишите в заголовке кратко суть вопроса, а не безинформативное "опять я".
А как подключен индикатор? Судя по коду через драйвер, вроде 4026. Но тогда другой вопрос: правильно ли подключен драйвер? Сколько разрядов в индикаторе?
Да использую CD4026, да все подключено верно проверил элементарным кодом который перебирает все числа в том числе и с 2мя разрядами. Проблема на мой взгляд в том что я подключил к 5 вольтам и термистор и индикатор, но даже после пробы подключить индикатор к 3.3 а термистор к 5ти, но всей равно работать отказывается. Сейчас запитаю от акума на 3.75, как попробую отпишусь
Потому что операция постинкремента возвращает предыдущее значение. Соответственно это предыдущее значение будет опять присвоено переменной var. Да и сам смысл такой конструкции сомнителен, ведь var++ уже изменяет переменную var, зачем ее присваивать самой себе же?
Нет юный падаван, похоже я тебя запутал. Я всего лишь говорю, что в твоем коде операция присвоения лишняя и ошибочная. Вот так работает постинкремент: Код (Text): int i = 0; int j; while (i < 3) { j = i++; } i j 1 0 2 1 3 2 Как видишь, i исправно увеличивает свое значение, но результатом этой операции всегда является предыдущее значение i, которое в данном коде копируется в переменную j. Тебе это значение не требуется, поэтому ни дополнительных переменных, ни операций присваивания тоже не требуется. А вот так может работать то, что ты написал: Код (Text): // var = var++; int oldValue = var; // постфикс неявно сохраняет старое значение var = var + 1; // инкремент var++ var = oldValue; // присвоение var = Или так Код (Text): // var = var++; int oldValue = var; // постфикс неявно сохраняет старое значение var = oldValue; // присвоение var = var = var + 1; // инкремент var++ По факту, какой вариант получится, зависит от компилятора и его настроек. Просто запомни, что var = var++ писать нельзя.
Так что же мне делать?? Как мне сделать так что-бы программа столько раз выполняла clock столько сколько в пременоой T
Эх, видимо объясняльщик из меня не очень: Код (Text): while (var < T) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); var++; } Вот так должно быть.
Наверное, стоит сохранять предыдущее значение температуры и, если температура не изменилась (или изменилась незначительно) по сравнению с предыдущим значением, то не обновлять данные на счетчике. Ну и задержка для чтения датчика должна быть разумная, нет смысла его бесконечно дергать, можно это делать раз в секунду/минуту/час например.
Все отладил вот код Код (Text): #include <math.h> #define TERMIST_B 4300 #define VIN 5.0 #define CLOCK_PIN 7 #define RESET_PIN 6 int var = 0; void R() { digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } void setup() { Serial.begin(9600); pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, 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 T = round(temperature); //Serial.println(T); delay(250); R(); while (var < T) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); var++; //Serial.println(var); } var = 0; }