Измените код программы таким образом, чтобы индикатор включался при 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);
}
Вопросы для проверки себя