Как
- Войдите на сайт для отправки комментариев
Втр, 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() но не уверен
Я просто работал уже с картинками но просто не могу вспомнить команды так что можно анализировать картинки
на ардуино
Перечитайте Керниана и Ритчи - там приведен почти полный список команд. А чтобы совсем полный - еще Страуструпа или Шилдта.
спасибо