Devices & Components
Arduino Uno Rev3
OLED 0.96'' 128x64
Micro servo SG90
HC-SR501 PIR sensor
Software & Tools
Arduino IDE
Project description
Code
robot code
cpp
c++ code
1#include <Servo.h> 2#include <Wire.h> 3#include <Adafruit_GFX.h> 4#include <Adafruit_SSD1306.h> 5 6#define SCREEN_WIDTH 128 7#define SCREEN_HEIGHT 64 8Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); 9 10Servo servo; 11int pirPin = 2; 12int servoPin = 9; 13int state = LOW; 14unsigned long lastBlink = 0; 15bool eyesOpen = true; 16 17void setup() { 18 servo.attach(servoPin); 19 pinMode(pirPin, INPUT); 20 servo.write(90); 21 Serial.begin(9600); 22 23 // Start OLED 24 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 25 Serial.println("Ошибка OLED"); 26 for (;;); 27 } 28 display.clearDisplay(); 29 drawEyesOpen(); 30} 31 32void loop() { 33 int val = digitalRead(pirPin); 34 35 if (val == HIGH) { 36 if (state == LOW) { 37 Serial.println("Обнаружено движение!"); 38 drawSurprised(); 39 delay(800); 40 drawWink(); 41 delay(600); 42 43 // Hand moving 44 for (int i = 0; i < 5; i++) { 45 servo.write(50); 46 delay(150); 47 servo.write(0); 48 delay(150); 49 } 50 servo.write(50); 51 drawEyesOpen(); 52 state = HIGH; 53 } 54 } else { 55 if (state == HIGH) { 56 Serial.println("Нет движения."); 57 state = LOW; 58 } 59 60 // Blinking 61 if (millis() - lastBlink > random(3000, 7000)) { 62 blink(); 63 lastBlink = millis(); 64 } 65 } 66} 67 68// === Eyes === 69 70void drawEyesOpen() { 71 display.clearDisplay(); 72 drawEye(34, 32, true); 73 drawEye(94, 32, true); 74 display.display(); 75} 76 77void drawEyesClosed() { 78 display.clearDisplay(); 79 drawEye(34, 32, false); 80 drawEye(94, 32, false); 81 display.display(); 82} 83 84void drawSurprised() { 85 display.clearDisplay(); 86 display.drawCircle(34, 32, 10, SSD1306_WHITE); 87 display.drawCircle(94, 32, 10, SSD1306_WHITE); 88 display.display(); 89} 90 91void drawWink() { 92 display.clearDisplay(); 93 drawEye(34, 32, true); 94 display.drawLine(84, 32, 104, 32, SSD1306_WHITE); 95 display.display(); 96} 97 98void blink() { 99 drawEyesClosed(); 100 delay(150); 101 drawEyesOpen(); 102} 103 104void drawEye(int x, int y, bool open) { 105 if (open) { 106 display.drawCircle(x, y, 10, SSD1306_WHITE); 107 display.fillCircle(x, y, 4, SSD1306_WHITE); 108 } else { 109 display.drawLine(x - 8, y, x + 8, y, SSD1306_WHITE); 110 } 111}
Comments
Only logged in users can leave comments