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

#include <math.h>

#define FIRST_LED_PIN 2

#define LED_COUNT 10

#define TERMIST_B 4300

#define VIN 5.0

void setup()

{

pinMode(13, OUTPUT);

for (int i = 0; i < LED_COUNT; ++i)

pinMode(i + FIRST_LED_PIN, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH);

float voltage = analogRead(A0) * VIN / 1023.0;

float r1 = voltage / (VIN - voltage);

float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;

for (int i = 0; i < LED_COUNT; i=i+5) {

boolean enableSegment = (temperature >= 0+i);

digitalWrite(i + FIRST_LED_PIN, enableSegment);

}

}

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

#include <math.h>

#define FIRST_LED_PIN 4

#define LED_COUNT 10

#define TERMIST_B 4300

#define VIN 5.0

#define BUZZER_PIN 3

void setup()

{

pinMode(13, OUTPUT);

for (int i = 0; i < LED_COUNT; ++i)

pinMode(i + FIRST_LED_PIN, OUTPUT);

pinMode(BUZZER_PIN, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH);

float voltage = analogRead(A0) * VIN / 1023.0;

float r1 = voltage / (VIN - voltage);

float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;

for (int i = 0; i < LED_COUNT; ++i) {

boolean enableSegment = (temperature >= 21+i);

digitalWrite(i + FIRST_LED_PIN, enableSegment);

if (temperature == 25)

tone(BUZZER_PIN, 3500, 100);

}

}

Эксперимент 16. Метеостанция

В этом эксперименте мы передаем данные об измерениях температуры на компьютер (например, для последующей обработки).

Схема

Код

#include <math.h>

int minute = 1;

#define TERMIST_B 4300

#define VIN 5.0

void setup()

{

pinMode(13, OUTPUT);

Serial.begin(9600);

Serial.println("Minute\tTemperature");

}

void loop()

{

digitalWrite(13, HIGH);

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.print(minute);

Serial.print("\t");

Serial.println(temperature);

delay(60000);

++minute;

}

Вопросы для проверки себя

Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?

· чтобы обмениваться данными, нужно начать соединение, поэтому Serial.begin(baudrate)вызывается в setup()

· Serial.print(data) отправляет содержимое data. Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: "". Кириллица, скорее всего, будет отображаться некорректно.

· Serial.println(data) делает то же самое, только добавляет в конце невидимый символ новой строки.

О каких ограничениях не следует забывать при работе с последовательным портом?

Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.

3.Как избежать ошибки в передаче данных, содержащих обратный слэш (\)?

Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: \\.

Задания для самостоятельного решения

1.Перед таблицей данных о температуре добавьте заголовок (например, "Meteostation").

#include <math.h>

int minute = 1;

#define TERMIST_B 4300

#define VIN 5.0

void setup()

{

pinMode(13, OUTPUT);

Serial.begin(9600);

Serial.println("Minute\tTemperature");

}

void loop()

{

digitalWrite(13, HIGH);

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.print("Meteostation");

Serial.print(minute);

Serial.print("\t");

Serial.println(temperature);

delay(60000);

++minute;

}

Добавьте столбец, содержащий количество секунд, прошедших с момента запуска микроконтроллера. Можно уменьшить интервал передачи данных.

Эксперимент 17. Пантограф

В этом эксперименте мы вращаем сервопривод на угол, задаваемый потенциометром.

Схема

Код

#include <Servo.h>

#define POT_MAX_ANGLE 270.0

Servo myServo;

void setup()

{

pinMode(13, OUTPUT);

myServo.attach(9);

}

void loop()

{

digitalWrite(13, HIGH);

int val = analogRead(A0);

int angle = int(val / 1024.0 * POT_MAX_ANGLE);

angle = constrain(angle, 0, 180);

myServo.write(angle);

}

Вопросы для проверки себя

Наши рекомендации