Как

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

День добрый. Имеется код секундомера скрещенного с термометром, все работает, однако хотелось бы что бы при остановке секундомера значение температуры не обновлялось вплоть до его сброса. Подскажите как это сделать.

#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;
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А автор кода чо говорит?

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Тут части от трех кодов, какого автора спросить?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Который секундомер делал, видимо. 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Мда, содержательно. В коде секундомера не было термометра изначально. Я переписал его под свой дисплей и добавил термометр подкорректировав его под свой термистор.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я думаю, что начать нужно с выяснения, какие именно строчки кода заставляют обновляться температуру.

v258
Offline
Зарегистрирован: 25.05.2020

Странный вопрос от человека с таким стажем. Добавьте в код флаг, при остановке секундомера сбрасывайте его, а при сбросе секундомера снова поднимайте. И показания термометра обновляйте только при условии, что флаг поднят. И будет вам счастье ))

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Adriano. 44-53 строки, и постоянно крутится в общем цикле.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

V258, лестно, но я только разбираю на кусочки и соединяю по своему, и иногда знаний не хватает. Попробую с флагом, хотя думал о буфере.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

antipod пишет:
Adriano. 44-53 строки, и постоянно крутится в общем цикле.

Значит, следует прекратить выполнение этих строк при остановке секундомера. Это можно сделать, минимум, двумя способами:

1. Введением флага работы (либо остановки) секундомера и обновлением показания темпертуры только при условии установки (либо сброса) этого флага.

2. Остановкой общего цикла при остановке секундомера.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Тут есть два вопроса:

- перекрасить Кремлёвскую стену в  цвета радуги и

- если digitalRead(pushButton) == 1 то чего у Вас в программе?

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Mykaida
1.Тихо и без свидетелей.
2. Запускается секундомер и выводятся на экран время и температура.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вы лучше определитесь - сами будете «допиливать» или кто-то за вас? Если первое - то вам ответ уже дали. Если второе - есть платный раздел «ищу исполнителя». 

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Ответ видел, спасибо. Позже попробую, интересно допилить самому.

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

Не понадобились флаги, просто функцию вычисления температуры поставил в начале цикла, и добавил переменную для температуры для второй фазы.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

И как в динамике?

antipod
antipod аватар
Offline
Зарегистрирован: 20.08.2013

BOOM, Стабильно хорошо, немного лишнего удалил, памяти еще полно.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я не про память спрашивал... Хорошо, если хорошо. 

Archermistoryi
Offline
Зарегистрирован: 13.12.2020

Добрый день. Как сделать анализ картинки на ардуино?  Точнее как узнать цвет пикселя в картинке?  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Считать цвет по нужным координатам.

Archermistoryi
Offline
Зарегистрирован: 13.12.2020

Да

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Бида в том, што Ардуина вовсе не предназначена для работы с картинками. 

Archermistoryi
Offline
Зарегистрирован: 13.12.2020

Я просто работал уже с картинками но просто не могу вспомнить команды так что можно анализировать картинки

на ардуино

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Храшо. С какими размерами картинок ты работал на Ардуино?

sadman41
Offline
Зарегистрирован: 19.10.2016

Опять какие-то волшебные команды... Хоть одним глазком бы на них взглянуть.

Archermistoryi
Offline
Зарегистрирован: 13.12.2020

Сколько памяти хватит в карте память но я не выходил за размеры 100 на 100 пикселей и вроде бы для указания размеров использовалась команда size() но не уверен

 

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Archermistoryi пишет:

Я просто работал уже с картинками но просто не могу вспомнить команды так что можно анализировать картинки

на ардуино

Перечитайте Керниана и Ритчи - там приведен почти полный список команд. А чтобы совсем полный - еще Страуструпа или Шилдта.

Archermistoryi
Offline
Зарегистрирован: 13.12.2020

спасибо