Как
- Войдите на сайт для отправки комментариев
Втр, 08/12/2020 - 11:19
День добрый. Имеется код секундомера скрещенного с термометром, все работает, однако хотелось бы что бы при остановке секундомера значение температуры не обновлялось вплоть до его сброса. Подскажите как это сделать.
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define B 3500 // B-коэффициент #define SERIAL_R 10034 // сопротивление последовательного резистора, 102 кОм #define THERMISTOR_R 10000 // номинальное сопротивления термистора, 100 кОм #define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм) unsigned long timing; const byte tempPin = A0; #define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях #define SCREEN_HEIGHT 64 // Высота OLED-дисплея в пикселях Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); int temp = 0; int pushButton = 7; int output = 8; int second = 0; int minute = 0; unsigned long msec = 0; unsigned long mili = 0; int pres = 0; int fase = 0; int start = 0; unsigned long tim = 0; void setup() { pinMode(tempPin, INPUT ); pinMode(8, OUTPUT); pinMode(7, INPUT_PULLUP); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); display.cp437(true); display.setTextColor(WHITE, BLACK); } void loop() { int t = analogRead( tempPin ); float tr = 1023.0 / t - 1; tr = SERIAL_R / tr; float temp; temp = tr / THERMISTOR_R; // (R/Ro) temp = log(temp); // ln(R/Ro) temp /= B; // 1/B * ln(R/Ro) temp += 1.0 / (NOMINAL_T + 273.15); // + (1/To) temp = 1.0 / temp; // Invert temp -= 273.15; int buttonState = digitalRead(pushButton); Serial.println(buttonState); display.clearDisplay(); if (digitalRead(pushButton) == 0) { if (pres == 0) { fase = fase + 1; pres = 1; if (fase > 2) fase = 0; } } else { pres = 0; } if (fase == 0) { display.clearDisplay(); display.setCursor(38, 1); display.setTextSize(2); display.print(utf8rus("Старт")); display.setCursor(0, 35); display.print(utf8rus("Темп")); display.print(":"); display.setCursor(63, 35); display.print(temp); second = 0; minute = 0; tim = 0; mili = 0; msec = 0; start = 0; } if (fase == 1) { digitalWrite(8, HIGH); display.clearDisplay(); display.setCursor(38, 1); display.print(utf8rus("Замер")); display.setCursor(0, 35); display.print(utf8rus("Темп")); display.print(":"); display.setCursor(63, 35); display.print(temp); if (start == 0) { start = 1; tim = millis(); } msec = (millis() - tim); minute = msec / 60000; if ((msec / 1000) > 59) { second = (msec / 1000) - (minute * 60); } else { second = msec / 1000; } mili = (msec % 1000) / 10; display.setCursor(20, 18); if (minute <= 9) { display.print("0"); display.print(minute); } else { display.print(minute); } display.print(":"); if (second <= 9) { display.print("0"); display.print(second); } else { display.print(second); } display.setFont(); display.setCursor(81, 18); display.print(":"); if (mili <= 9) { display.print("0"); display.print(mili); } else { display.print(mili); } } if (fase == 2) { digitalWrite(8, LOW); display.clearDisplay(); display.setCursor(38, 1); display.print(utf8rus("Время")); display.setCursor(0, 35); display.print(utf8rus("Темп")); display.print(":"); display.setCursor(63, 35); display.print(temp); display.setCursor(20, 18); if (minute <= 9) { display.print("0"); display.print(minute); } else { display.print(minute); } display.print(":"); if (second <= 9) { display.print("0"); display.print(second); } else { display.print(second); } display.setCursor(81, 18); display.print(":"); if (mili <= 9) { display.print("0"); display.print(mili); } else { display.print(mili); } } display.display(); } String utf8rus(String source) { int i, k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; } } } m[0] = n; target = target + String(m); } return target; }
А автор кода чо говорит?
Тут части от трех кодов, какого автора спросить?
Который секундомер делал, видимо.
Мда, содержательно. В коде секундомера не было термометра изначально. Я переписал его под свой дисплей и добавил термометр подкорректировав его под свой термистор.
Я думаю, что начать нужно с выяснения, какие именно строчки кода заставляют обновляться температуру.
Странный вопрос от человека с таким стажем. Добавьте в код флаг, при остановке секундомера сбрасывайте его, а при сбросе секундомера снова поднимайте. И показания термометра обновляйте только при условии, что флаг поднят. И будет вам счастье ))
Adriano. 44-53 строки, и постоянно крутится в общем цикле.
V258, лестно, но я только разбираю на кусочки и соединяю по своему, и иногда знаний не хватает. Попробую с флагом, хотя думал о буфере.
Значит, следует прекратить выполнение этих строк при остановке секундомера. Это можно сделать, минимум, двумя способами:
1. Введением флага работы (либо остановки) секундомера и обновлением показания темпертуры только при условии установки (либо сброса) этого флага.
2. Остановкой общего цикла при остановке секундомера.
Тут есть два вопроса:
- перекрасить Кремлёвскую стену в цвета радуги и
- если digitalRead(pushButton) == 1 то чего у Вас в программе?
Mykaida
1.Тихо и без свидетелей.
2. Запускается секундомер и выводятся на экран время и температура.
Вы лучше определитесь - сами будете «допиливать» или кто-то за вас? Если первое - то вам ответ уже дали. Если второе - есть платный раздел «ищу исполнителя».
Ответ видел, спасибо. Позже попробую, интересно допилить самому.
Не понадобились флаги, просто функцию вычисления температуры поставил в начале цикла, и добавил переменную для температуры для второй фазы.
И как в динамике?
BOOM, Стабильно хорошо, немного лишнего удалил, памяти еще полно.
Я не про память спрашивал... Хорошо, если хорошо.
Добрый день. Как сделать анализ картинки на ардуино? Точнее как узнать цвет пикселя в картинке?
Считать цвет по нужным координатам.
Да
Бида в том, што Ардуина вовсе не предназначена для работы с картинками.
Я просто работал уже с картинками но просто не могу вспомнить команды так что можно анализировать картинки
на ардуино
Храшо. С какими размерами картинок ты работал на Ардуино?
Опять какие-то волшебные команды... Хоть одним глазком бы на них взглянуть.
Сколько памяти хватит в карте память но я не выходил за размеры 100 на 100 пикселей и вроде бы для указания размеров использовалась команда size() но не уверен
Я просто работал уже с картинками но просто не могу вспомнить команды так что можно анализировать картинки
на ардуино
Перечитайте Керниана и Ритчи - там приведен почти полный список команд. А чтобы совсем полный - еще Страуструпа или Шилдта.
спасибо