#include <Servo.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "wiring_private.h"
#include "pins_arduino.h"
#define SWITCH_PIN 2
#define LED_PIN 8
#define BUZZER_PIN 10
#define SERVO_PIN 9
#define PIR_PIN 3
#define bit2(b) (1UL << (b))
Servo servoMotor;
void delay2(unsigned long ms) {
while (ms > 0) {
_delay_ms(1); // Delay for 1 millisecond
ms--;
}
}
int generateRandom(int minimum, int maximum) {
return minimum + rand() % (maximum - minimum + 1);
}
void digitalWrite2(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit2 = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
if (val == LOW) {
*out &= ~bit2;
} else {
*out |= bit2;
}
SREG = oldSREG;
}
int digitalRead2(uint8_t pin)
{
uint8_t bit2 = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
if (port == NOT_A_PIN) return LOW;
if (*portInputRegister(port) & bit2) return HIGH;
return LOW;
}
void pinMode2(uint8_t pin, uint8_t mode)
{
uint8_t bit2 = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg, *out;
if (port == NOT_A_PIN) return;
reg = portModeRegister(port);
out = portOutputRegister(port);
if (mode == INPUT) {
uint8_t oldSREG = SREG;
cli();
*reg &= ~bit2;
*out &= ~bit2;
SREG = oldSREG;
} else if (mode == INPUT_PULLUP) {
uint8_t oldSREG = SREG;
cli();
*reg &= ~bit2;
*out |= bit2;
SREG = oldSREG;
} else {
uint8_t oldSREG = SREG;
cli();
*reg |= bit2;
SREG = oldSREG;
}
}
void setup() {
pinMode2(SWITCH_PIN, INPUT_PULLUP);
pinMode2(LED_PIN, OUTPUT);
pinMode2(BUZZER_PIN, OUTPUT);
pinMode2(PIR_PIN, INPUT);
servoMotor.attach(SERVO_PIN);
srand(time(0));
}
void loop()
{
int switchState = digitalRead2(SWITCH_PIN);
int motionState = digitalRead2(PIR_PIN);
if (switchState == LOW && motionState == HIGH)
{
for (int i = 0; i < 3; i++)
{
digitalWrite2(LED_PIN, HIGH);
digitalWrite2(BUZZER_PIN, HIGH);
delay2(100);
digitalWrite2(LED_PIN, LOW);
digitalWrite2(BUZZER_PIN, LOW);
delay2(100);
}
int randomAngle = generateRandom(0, 180);
servoMotor.write(randomAngle);
delay2(1000);
} else {
digitalWrite2(LED_PIN, LOW);
digitalWrite2(BUZZER_PIN, LOW);
servoMotor.write(0);
}
}