lab4_demo_qti_calibration.ino
3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#define BUTTON_PIN 2
#define LEFT_QTI_PIN A0
#define MIDDLE_QTI_PIN A1
#define RIGHT_QTI_PIN A2
#define NUM_OF_MEASUREMENTS 10
const uint8_t debounceDelay = 50; // the debounce time; increase if the output flickers
void setup()
{
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
}
void loop()
{
Serial.println("Leiame QTI sensorite tumeda ja heleda pinna keskmise väärtuse.");
Serial.println("Pane roboti kõik QTI sensorid tumedale pinnale ja vajuta nuppu.");
WaitForBtnClick();
uint16_t darkSurface = MeasureQtiAverage();
Serial.print("Tumeda pinna keskmine väärtus on: ");
Serial.println(darkSurface);
Serial.println("Pane roboti kõik QTI sensorid heledale pinnale ja vajuta nuppu.");
WaitForBtnClick();
uint16_t lightSurface = MeasureQtiAverage();
Serial.print("Heleda pinna keskmine väärtus on: ");
Serial.println(lightSurface);
Serial.print("Soovituslik ""qti_threshold"" väärtus on: ");
Serial.println((lightSurface + darkSurface) / 2);
Serial.println("Uuesti mõõtmiseks vajuta nuppu.");
WaitForBtnClick();
Serial.println("------------------------------------------------------------------------");
}
uint16_t ReadQti(uint8_t qtiPin)
{
digitalWrite(qtiPin, HIGH); // Lülitame infrapuna sisse
delayMicroseconds(1000); // Ootame 1 ms
digitalWrite(qtiPin, LOW); // Lülitame infrapuna välja
return analogRead(qtiPin); // Loeme kondensaatorilt tulemuse
}
void WaitForBtnClick()
{
while (ButtonRead() != true);
}
uint16_t MeasureQtiAverage(void)
{
uint16_t leftQtiSum = 0;
uint16_t middleQtiSum = 0;
uint16_t rightQtiSum = 0;
/* Summeerime üle N mõõtmise */
for (uint8_t i = 0; i < NUM_OF_MEASUREMENTS; i++)
{
leftQtiSum += ReadQti(LEFT_QTI_PIN);
middleQtiSum += ReadQti(MIDDLE_QTI_PIN);
rightQtiSum += ReadQti(RIGHT_QTI_PIN);
delay(100);
}
/* Leiame kõigi sensorite keskmised tulemused*/
uint16_t leftQtiAverage = leftQtiSum / NUM_OF_MEASUREMENTS;
uint16_t middleQtiAverage = middleQtiSum / NUM_OF_MEASUREMENTS;
uint16_t rightQtiAverage = rightQtiSum / NUM_OF_MEASUREMENTS;
Serial.println("Sensorite kesmine väärtus:");
Serial.println("Vasak | Keskmine | Parem");
Serial.print(leftQtiAverage);
Serial.print("\t");
Serial.print( middleQtiAverage);
Serial.print("\t ");
Serial.println( rightQtiAverage);
/* Leiame pinna üldise keskmise */
uint16_t surface = (leftQtiSum + middleQtiSum + rightQtiSum) / (NUM_OF_MEASUREMENTS * 3);
return surface;
}
/* Compacted version of https://docs.arduino.cc/built-in-examples/digital/Debounce/ */
bool ButtonRead()
{
static bool lastButtonState = LOW;
static uint32_t lastDebounceTime = 0;
static bool buttonState = LOW;
bool btnReadValue = digitalRead(BUTTON_PIN);
if (btnReadValue != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (btnReadValue != buttonState) {
buttonState = btnReadValue;
if (buttonState == HIGH) {
return true;
}
}
}
lastButtonState = btnReadValue;
return false;
}