Чем неудобно использование чисел с плавающей точкой на Arduino?
Точность вычислений с такими данными невелика, у вас могут возникнуть неожиданные ошибки, например, при использовании float в условном операторе.
4.Что за выражение стоит справа от = при объявлении булевой переменной enableSegment?
Определяем сколько сигментов должно гореть.
Задания для самостоятельного решения
Измените код программы таким образом, чтобы индикатор включался при 0 градусов и его показания прирастали на одно деление каждые 5 градусов.
Листинг:
1. #include <math.h>
2. #define FIRST_LED_PIN 2
3. #define LED_COUNT 10
4. #define TERMIST_B 4300
5. #define VIN 5.0
6. void setup()
7. {
8. pinMode(13, OUTPUT);
9. for (int i = 0; i < LED_COUNT; ++i)
10. pinMode(i + FIRST_LED_PIN, OUTPUT);
11. }
12. void loop()
13. {
14. digitalWrite(13, HIGH);
15. float voltage = analogRead(A0) * VIN / 1023.0;
16. float r1 = voltage / (VIN - voltage);
17. float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
18. for (int i = 0; i < LED_COUNT; i=i+5) {
19. boolean enableSegment = (temperature >= 0+i);
20. digitalWrite(i + FIRST_LED_PIN, enableSegment);
21. }
22. }
2.Добавьте в схему пьезопищалку и доработайте программу так, чтобы срабатывала звуковая сигнализация при достижении температуры, например, 25 градусов.
Листинг:
1. #include <math.h>
2. #define FIRST_LED_PIN 4
3. #define LED_COUNT 10
4. #define TERMIST_B 4300
5. #define VIN 5.0
6. #define BUZZER_PIN 3
7. void setup()
8. {
9. pinMode(13, OUTPUT);
10. for (int i = 0; i < LED_COUNT; ++i)
11. pinMode(i + FIRST_LED_PIN, OUTPUT);
12. pinMode(BUZZER_PIN, OUTPUT);
13. }
14. void loop()
15. {
16. digitalWrite(13, HIGH);
17. float voltage = analogRead(A0) * VIN / 1023.0;
18. float r1 = voltage / (VIN - voltage);
19. float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
20. for (int i = 0; i < LED_COUNT; ++i) {
21. boolean enableSegment = (temperature >= 21+i);
22. digitalWrite(i + FIRST_LED_PIN, enableSegment);
23. if (temperature == 25)
24. tone(BUZZER_PIN, 3500, 100);
25. }
26. }
Эксперимент 16. Метеостанция
В этом эксперименте мы передаем данные об измерениях температуры на компьютер (например, для последующей обработки).
Принципиальная схема
Код
1. #include <math.h>
2. int minute = 1;
3. #define TERMIST_B 4300
4. #define VIN 5.0
5. void setup()
6. {
7. pinMode(13, OUTPUT);
8. Serial.begin(9600);
9. Serial.println("Minute\tTemperature");
10. }
11. void loop()
12. {
13. digitalWrite(13, HIGH);
14. float voltage = analogRead(A0) * VIN / 1024.0;
15. float r1 = voltage / (VIN - voltage);
16. float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
17. Serial.print(minute);
18. Serial.print("\t");
19. Serial.println(temperature);
20. delay(60000);
21. ++minute;
22. }
Вопросы для проверки себя
Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?
· чтобы обмениваться данными, нужно начать соединение, поэтому Serial.begin(baudrate)вызывается в setup()
· Serial.print(data) отправляет содержимое data. Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: "". Кириллица, скорее всего, будет отображаться некорректно.
· Serial.println(data) делает то же самое, только добавляет в конце невидимый символ новой строки.