/******************************************************************************* * * I17 - Sensor ultrassonico como régua eletrônica com indicador luminoso * Autor: Angelo Luis Ferreira * 06/04/2022 * http://squids.com.br/arduino * *******************************************************************************/ // biblioteca para sensor ultrassônico #include // inclui a biblioteca do módulo HC-SR04 // bibliotecas para OLED #include // caso utilize comunicação SPI #include // biblioteca requerida para I2C #include // biblioteca OLED #include // biblioteca OLED // configuração do display OLED #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 (OLED) display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // define pinos de entrada e saída do Arduino const byte pinTrig = 7; // pino digital usado para disparar os pulsos do sensor const byte pinEcho = 8; // pino digital usado para ler a saida do sensor const byte pinBut = 2; // pino digital usado para o push button const int R = 9, G = 10, B = 11; // pinos digitais usados para o led RGB // limites de distancia de controle para atual o indicador luminoso // os limtes min e max podem ser definidos entre 2cm e 400cm byte limitMin = 5; // limite mínimo (5cm) byte limitMax = 20; // limite máximo (20cm) // define se o led RGB é catodo comum(GND) = 0 ou anodo comum(Vcc) = 1 boolean ledType = 1; // ATENÇÃO: se o led for catodo comum, mude para 0 // define outras variáveis globais para medir as distâncias byte state = 1; // estado do menu byte decimal = 0; // número de casas decimais String unity = "cm"; // descrição das unidades double *result; // uso do ponteiro para um double (obrigatório) void setup(){ // pin mode - definie entradas e saídas digitais pinMode(pinBut, INPUT_PULLUP); // pullup interno do Arduino pinMode(R, OUTPUT); pinMode(G, OUTPUT); pinMode(B, OUTPUT); // inicializa o senor HC-SR04 HCSR04.begin(pinTrig,pinEcho); // Inicializa a porta serial Serial.begin(9600); // inicializa a comunicação I2C do OLED end 0X3C display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Clear the buffer e layout do display OLED display.clearDisplay(); } void loop(){ readPushButton(); // verifica se o pushbutton foi acionado sowDisplay(); // exibe a distância no display lcd pointerLight(HCSR04.measureDistanceCm()[0]); // exibe cor na luz indicadora (led rgb)) delay(300); // delay de 300us } // verifica se o botão foi acionado - altera para cm, mm ou pol void readPushButton() { if (!digitalRead(pinBut)) { // verifica se o botão foi acionado = LOW state >= 3 ? state = 0 : state = state; state++; while (!digitalRead(pinBut)) {} // aguarda soltar o botão delay(150); // delay para reduzir o efeito bouncing } } // exibe a distância no display lcd void sowDisplay() { // faz leitura de acordo com o valor da variável state byte x; switch (state) { case 1: result = HCSR04.measureDistanceCm(); decimal = 0; unity = " cm"; x = 40; break; case 2: result = HCSR04.measureDistanceMm(); unity = " mm"; decimal = 0; x = 30; break; case 3: result = HCSR04.measureDistanceIn(); unity = " in"; decimal = 1; x = 30; break; } //Exibe no display as distâncias em cm, mm ou em polegadas (inchies) // imprime "Régua Eletrônica" display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(15, 0); display.print("Regua Eletronica"); display.drawRoundRect(0, 16, 128, 48, 3, WHITE); // desenha retângulo inferior // imprime "Squids Arduino" display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20, 25); display.print("Squids Arduino"); // imprime distância display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(x, 40); display.print(result[0],decimal); display.print(unity); // exibe no display display.display(); // limpa o display display.clearDisplay(); } // define cor do led indicador pela distância (led rgb) void pointerLight(int distance) { int inc = (limitMax - limitMin)/3; // define incremento para alteraçao cores usando 3 cores if (distance <=limitMin || distance > limitMax) { setColor(255,255,255); } else if (distance >= limitMin && distance < limitMin + inc) { setColor(0,0,255); // azul } else if (distance >= limitMin + inc && distance < limitMin + 2*inc) { setColor(0,255,0); // verde }else if (distance >= limitMin + 2*inc && distance <= limitMax) { setColor(255,0,0); // vermelho } } // exibe cor do led indicador (led rgb) void setColor(int red, int green, int blue) { if (ledType == 1) { red = 255-red, green = 255-green, blue = 255-blue; } // ativando led rgb nas cores definida pela distância analogWrite(R, red); analogWrite(G, green); analogWrite(B, blue); }