forked from IFRN-SC/robo_hardware
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cor.cpp
95 lines (75 loc) · 2.09 KB
/
cor.cpp
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
#include "cor.h"
SensorCor::SensorCor(int s2_dado, int s3_dado, int out_dado){
s2 = s2_dado;
s3 = s3_dado;
out = out_dado;
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
}
void SensorCor::atualizarRGB(){
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
rgb.vermelho = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
rgb.azul = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
rgb.verde = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
RGB SensorCor::getRGB(){
atualizarRGB();
return rgb;
}
int SensorCor::calculeMaximo(int vermelho, int verde, int azul){
int Maximo = 0;
if(verde >= vermelho && verde >= azul){
Maximo = verde;
}else if(vermelho >= verde && vermelho >= azul){
Maximo = vermelho;
}else if(azul >= verde && azul >= vermelho){
Maximo = azul;
}
return Maximo;
}
int SensorCor::calculeMinimo(int vermelho, int verde, int azul){
int Minimo = 0;
if(verde <= vermelho && verde <= azul){
Minimo = verde;
}else if(vermelho <= verde && vermelho <= azul){
Minimo = vermelho;
}else if(azul <= verde && azul <= vermelho){
Minimo = azul;
}
return Minimo;
}
HSV SensorCor::getHSV(){
atualizarRGB();
float Maximo = 0;
float Minimo = 0;
int vermelho = rgb.vermelho;
int azul = rgb.azul;
int verde = rgb.verde;
Minimo = calculeMinimo(vermelho,verde,azul);
Maximo = calculeMaximo(vermelho,verde,azul);
if(Maximo == vermelho && verde >= azul){
hsv.h = 60 * (verde - azul)/ (Maximo - Minimo) ;
}else if(Maximo == vermelho && verde < azul){
hsv.h = 60 * (verde - azul)/(Maximo - Minimo) + 360;
}else if(Maximo == verde){
hsv.h = 60 * (azul - vermelho)/(Maximo - Minimo) + 120;
}else if(Maximo == azul){
hsv.h = 60 * (vermelho - verde)/(Maximo - Minimo) + 240;
}
hsv.s = (Maximo - Minimo) / Maximo;
hsv.v = Maximo;
return hsv;
}
int SensorCor::getVerde(){
return rgb.verde;
}
int SensorCor::getVermelho(){
return rgb.vermelho;
}
int SensorCor::getAzul(){
return rgb.azul;
}