Skip to content

Commit 7cc2631

Browse files
author
Axel Minet
committed
initial commit
1 parent 5fd8162 commit 7cc2631

1 file changed

Lines changed: 230 additions & 0 deletions

File tree

kevin-the-sorting-owl.ino

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
#include <credentials.h>
2+
#include <SoftwareSerial.h>
3+
#include <DFPlayer_Mini_Mp3.h>
4+
SoftwareSerial mySerial(D3, D4); // RX, TX
5+
6+
#include <Metro.h>
7+
8+
// esphelper
9+
#include "ESPHelper.h"
10+
#include <strings.h>
11+
#include <time.h>
12+
#define NETWORK_HOSTNAME "Owl"
13+
14+
char* hostnameStr = NETWORK_HOSTNAME;
15+
char* owlMp3Topic = "owl/mp3";
16+
17+
int randInt = 0;
18+
int prevRandInt = 0;
19+
20+
netInfo homeNet = {
21+
.mqttHost = "192.168.1.76", //can be blank if not using MQTT
22+
.mqttUser = "", //can be blank
23+
.mqttPass = "", //can be blank
24+
.mqttPort = 1883, //default port for MQTT is 1883 - only chance if needed.
25+
.ssid = my_SSID,
26+
.pass = my_PASSWORD
27+
};
28+
ESPHelper myESP(&homeNet);
29+
30+
int fadeAmount = 5;
31+
int brightness = 0;
32+
int eyes;
33+
int owlState = false;
34+
bool radarStatus = false;
35+
bool mqttActive= false;
36+
String currentPlayer;
37+
38+
39+
Metro publishTimer = Metro(300);
40+
41+
void blink(int repeat){
42+
for(int i=0; i<repeat; i++){
43+
digitalWrite(D1, HIGH);
44+
digitalWrite(D2, HIGH);
45+
delay(100);
46+
digitalWrite(D1, LOW);
47+
digitalWrite(D2, LOW);
48+
delay(900);
49+
}
50+
}
51+
52+
53+
54+
55+
56+
57+
char *players[]={
58+
"20",
59+
"21",
60+
"22",
61+
"23",
62+
"24",
63+
"25",
64+
"26",
65+
"27",
66+
"28",
67+
"29",
68+
"30",
69+
"31"
70+
};
71+
int playNum = sizeof(players);
72+
73+
74+
long player;
75+
76+
77+
void setup() {
78+
Serial.begin(9600);
79+
80+
// esphelper
81+
Serial.println("Connecting to Wi-Fi");
82+
myESP.addSubscription(owlMp3Topic);
83+
myESP.begin();
84+
myESP.setCallback(mqttCallback);
85+
86+
87+
// initialise eyes
88+
pinMode(D1, OUTPUT);
89+
pinMode(D2, OUTPUT);
90+
digitalWrite(D1, LOW);
91+
digitalWrite(D2, LOW);
92+
93+
// dfplayer
94+
mySerial.begin (9600);
95+
mp3_set_serial (mySerial); //set softwareSerial for DFPlayer-mini mp3 module
96+
delay(1); // delay 1ms to set volume
97+
mp3_set_volume (30); // value 0~30
98+
blink(3);
99+
100+
101+
}
102+
103+
void loop() {
104+
105+
if(myESP.loop() == FULL_CONNECTION && !mqttActive){
106+
Serial.println("connected");
107+
mqttActive= true;
108+
publishTimer.interval(8000);
109+
owlState = true;
110+
mp3_play (19);
111+
};
112+
113+
//Serial.println(millis() / 1000);
114+
115+
unsigned long seed=seedOut(50);
116+
randomSeed(seed);
117+
118+
// is the owl active?
119+
if(owlState){
120+
brightness = brightness + fadeAmount;
121+
if (brightness <= 0 || brightness >= 250) fadeAmount = -fadeAmount;
122+
}
123+
else{ // fade eyes to 0
124+
publishTimer.interval(300);
125+
brightness = brightness -5;
126+
if(brightness<5) {
127+
brightness=0;
128+
fadeAmount = 5;
129+
owlState = false;
130+
}
131+
}
132+
133+
134+
// reset owl when timer has expired
135+
if(publishTimer.check()){
136+
owlState = false;
137+
138+
// pir sensor code
139+
if((analogRead(A0)>1000) != radarStatus){
140+
radarStatus = !radarStatus;
141+
142+
randInt = random(3,13);
143+
while(randInt == prevRandInt){
144+
randInt = random(3,13);
145+
}
146+
mp3_play (randInt);
147+
publishTimer.interval(20000);
148+
owlState = true;
149+
}
150+
}
151+
152+
// control eyes
153+
eyes = brightness - 70;
154+
if(eyes<0)eyes=0;
155+
analogWrite(D1, eyes);
156+
analogWrite(D2, eyes);
157+
delay(3);
158+
}
159+
160+
161+
162+
unsigned int bitOut(void) {
163+
static unsigned long firstTime=1, prev=0;
164+
unsigned long bit1=0, bit0=0, x=0, port=0, limit=10;
165+
if (firstTime) {
166+
firstTime=0;
167+
prev=analogRead(port);
168+
}
169+
while (limit--) {
170+
x=analogRead(port);
171+
bit1=(prev!=x?1:0);
172+
prev=x;
173+
x=analogRead(port);
174+
bit0=(prev!=x?1:0);
175+
prev=x;
176+
if (bit1!=bit0)
177+
break;
178+
}
179+
return bit1;
180+
}
181+
182+
unsigned long seedOut(unsigned int noOfBits) {
183+
unsigned long seed=0;
184+
for (int i=0;i<noOfBits;++i)
185+
seed = (seed<<1) | bitOut();
186+
return seed;
187+
}
188+
189+
void mqttCallback(char* topic, byte* payload, unsigned int length) {
190+
String payloadStr = String((char *)payload).substring(0,length);
191+
Serial.print("mqtt: ");
192+
if(String(topic) == owlMp3Topic){
193+
publishTimer.interval(5000);
194+
owlState = true;
195+
196+
switch( payloadStr.toInt()){
197+
case 1:
198+
Serial.println("plant");
199+
mp3_play (1);
200+
break;
201+
case 2:
202+
Serial.println("visitor");
203+
mp3_play (2);
204+
break;
205+
case 99:
206+
{
207+
Serial.println("random number");
208+
bool unique = false;
209+
do{
210+
player = (random(playNum/sizeof(char*)));
211+
if(players[player] != ""){
212+
currentPlayer = players[player];
213+
Serial.println(currentPlayer);
214+
mp3_play (currentPlayer.toInt());
215+
players[player] = "";
216+
unique = true;
217+
}
218+
yield();
219+
}
220+
while (unique == false);
221+
}
222+
223+
break;
224+
default:
225+
Serial.println("unknown:"+payloadStr);
226+
mp3_play (payloadStr.toInt());
227+
break;
228+
}
229+
}
230+
}

0 commit comments

Comments
 (0)