Владимир Сарана
Published © GPL3+

Freg troll "Stop eating" v.1

The unit records data on the time and number of refrigerator openings to the SD card, comments on people's actions

IntermediateFull instructions provided233
Freg troll "Stop eating" v.1

Things used in this project

Story

Read more

Schematics

Freg Troll

"Refrigerator Troll" is an autonomous device that records the time and duration of opening the refrigerator door, the MP3 player comments on actions depending on the time of opening the refrigerator door with "demotivating" sayings, poems and proverbs. In the future, to enhance the wow effect, it is planned to camouflage its body under a fruit juice bag. The project uses Arduino Nano, DFPlayer mini (speaker 0.5 W, 8 ohms), real-time clock module DS3231, SD memory card module. The voltage is supplied from two 18650 batteries via a homemade power stabilizer based on the lm7805cv.

Code

Freg Troll

C/C++
"Refrigerator Troll" is an autonomous device that records the time and duration of opening the refrigerator door, the MP3 player comments on actions depending on the time of opening the refrigerator door with "demotivating" sayings, poems and proverbs. In the future, to enhance the wow effect, it is planned to camouflage its body under a fruit juice bag. The project uses Arduino Nano, DFPlayer mini (speaker 0.5 W, 8 ohms), real-time clock module DS3231, SD memory card module. The voltage is supplied from two 18650 batteries via a homemade power stabilizer based on the lm7805cv.
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

#include <DFPlayerMega.h>

#include <SD.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 4);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;


File _sd1DF;
String _sd1TS;

int _volsetup= 25;
int _eqsetup= 4;
DFPlayerMega dfPlayerMega= DFPlayerMega ();
int Folder;
long Track;
bool StartTrack;
bool StopTrack;
bool _dfstart1= 0;
bool _dfstart1I= 0;
bool _dfpause1= 0;
bool _dfpause1I= 0;
struct _I2CRealRimeClockTime
{
 byte seconds = 0;
 byte minutes = 0;
 byte Hours = 0;
 byte weekday = 0;
 byte day = 0;
 byte month = 0;
 byte year = 0;
 unsigned long startTime = 0;
};
_I2CRealRimeClockTime _RTC1;
int _gtv2;
String _gtv5;
bool _gtv6 = 0;
int _disp4oldLength = 0;
int _swi1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int _disp1oldLength = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _RTCST_Ost1 = 0;
int _disp5oldLength = 0;
int _swi2;
int _disp2oldLength = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
int _disp3oldLength = 0;
String _RTC1_GetTime1_StrOut;
byte _RTC1_GetTime1_HourOut = 0;
byte _RTC1_GetTime1_MinOut = 0;
byte _RTC1_GetTime1_SecOut = 0;
byte _RTC1_GetTime1_DayOut = 0;
byte _RTC1_GetTime1_MounthOut = 0;
byte _RTC1_GetTime1_YearOut = 0;
byte _RTC1_GetTime1_DowOut = 0;
bool _sd1SVOS1 = 0;
long _strFunrand1 = 0L;

void setup()
{
pinMode(8, OUTPUT); 
digitalWrite(8, 0); 


Wire.begin();
delay(10);
Wire.beginTransmission(68);
Wire.write(0x0E);
Wire.write(B00000000);
Wire.write(B10001000);
Wire.endTransmission();
_RTC1.startTime = millis() - 1000;
_lcd1.init();
_lcd1.backlight();
randomSeed(analogRead(1));
SD.begin(9);
SPI.begin();
pinMode(10, OUTPUT);
Serial.begin (9600);
dfPlayerMega.set_serial (Serial);
delay(500);
dfPlayerMega.normal_mode();
delay(500);
dfPlayerMega.set_volume( _volsetup);
delay(500);
dfPlayerMega.set_EQ(_eqsetup);
delay(500);


}
void loop()
{

if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}





//:1
 if (!(0))
{ if (!(_RTCST_Ost1))
{set3231Date(0x68, &_RTC1, 0, 47, 23, 18, 12, 1972, 1);
get3231Date(0x68, &_RTC1);
_RTCST_Ost1 = 1;
}}
 else
{ _RTCST_Ost1 = 0;}
get3231Date(0x68, &_RTC1);
_RTC1_GetTime1_StrOut = ( _convertRealTimeClockNumberToString(_RTC1.day))+
String("-")+
( _convertRealTimeClockNumberToString(_RTC1.month))+
String("-")+
(String("20") +( _convertRealTimeClockNumberToString (_RTC1.year)))+
String(", ")+
( _convertRealTimeClockNumberToString(_RTC1.Hours))+
String(":")+
( _convertRealTimeClockNumberToString(_RTC1.minutes))+
String(":")+
( _convertRealTimeClockNumberToString(_RTC1.seconds));
_RTC1_GetTime1_HourOut = _RTC1.Hours;
_RTC1_GetTime1_MinOut = _RTC1.minutes;
_RTC1_GetTime1_SecOut = _RTC1.seconds;
_RTC1_GetTime1_DayOut = _RTC1.day;
_RTC1_GetTime1_MounthOut = _RTC1.month;
_RTC1_GetTime1_YearOut = _RTC1.year;
_RTC1_GetTime1_DowOut = _RTC1.weekday;
if (!(0)) {
_dispTempLength1 = ((_RTC1_GetTime1_StrOut)).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((_RTC1_GetTime1_StrOut));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
_gtv5 = _RTC1_GetTime1_StrOut;
_gtv2 = _RTC1_GetTime1_HourOut;

//:2

if(_gtv6)
{_swi1=1;}
else
{_swi1=0;}
if (!(0)) {
_dispTempLength1 = (((String(_swi1, DEC)))).length();
if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(0, 2);
_lcd1.print(((String(_swi1, DEC))));
} else {
if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;} 
}
if (_gtv6) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; 
 if(_trgrt2) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 1000)) _tim1O = 0;}}}
if(_tim1O)
{_swi2=1;}
else
{_swi2=0;}
if (!(0)) {
_dispTempLength1 = (((String(_swi2, DEC)))).length();
if (_disp4oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp4oldLength = _dispTempLength1;
_lcd1.setCursor(4, 2);
_lcd1.print(((String(_swi2, DEC))));
} else {
if (_disp4oldLength > 0) {_isNeedClearDisp1 = 1; _disp4oldLength = 0;} 
}
if (_trgrt2) {
_strFunrand1 = random(1, 7);
}
if (!(0)) {
_dispTempLength1 = (((String(_strFunrand1, DEC)))).length();
if (_disp5oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp5oldLength = _dispTempLength1;
_lcd1.setCursor(9, 1);
_lcd1.print(((String(_strFunrand1, DEC))));
} else {
if (_disp5oldLength > 0) {_isNeedClearDisp1 = 1; _disp5oldLength = 0;} 
}
Folder = 1;
Track = _strFunrand1;
StartTrack = _trgrt2;
StopTrack = 0;

 if (StartTrack) { if (_dfstart1I) { _dfstart1 = 0;} else {_dfstart1 = 1; _dfstart1I = 1;} } else {_dfstart1 = 0; _dfstart1I = 0;};
 if( _dfstart1 == true) {dfPlayerMega.start_track ( Folder, Track );};

 if (StopTrack) { if (_dfpause1I) { _dfpause1 = 0;} else {_dfpause1 = 1; _dfpause1I = 1;} } else {_dfpause1 = 0; _dfpause1I = 0;};
 if( _dfpause1 == true) {dfPlayerMega.pause ();};

//:3
if (!(0)) {
_dispTempLength1 = (((String( (analogRead (0)), DEC)))).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print(((String( (analogRead (0)), DEC))));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} 
}
digitalWrite(8, ( (analogRead (0))) <= (400));
_gtv6 = ( (analogRead (0))) <= (400);
if (_gtv6) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
 if(_trgrt1)
{if(! _sd1SVOS1) {
_sd1TS = "000;"; 
_sd1TS+= "String;";
get3231Date(0x68, &_RTC1);
_sd1TS+= String(_RTC1.day); 
_sd1TS+= "-";
_sd1TS+= String(_RTC1.month); 
_sd1TS+= "-";
_sd1TS+= String(_RTC1.year); 
_sd1TS+= " ";
_sd1TS+= String(_RTC1.Hours); 
_sd1TS+= ":";
_sd1TS+= String(_RTC1.minutes); 
_sd1TS+= ":";
_sd1TS+= String(_RTC1.seconds); 
_sd1TS+= ";";
_sd1TS+= _gtv5; 
_sd1TS+= ";";
_sd1TS+= String(""); 
_sd1TS+= ";";
_sd1DF = SD.open("777.log", FILE_WRITE);
if (_sd1DF) {_sd1DF.println(_sd1TS); _sd1DF.close();}
_sd1SVOS1 = 1;}}
else
{if( _sd1SVOS1) {_sd1SVOS1 = 0; }}






}

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
byte decToBcd(byte val)
 {
   return ( (val/10*16) + (val%10) );
 }
void set3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct, int sec, int  minut, int hou, int dat, int mo, int ye, int daW)
{
  byte temp;

  Wire.beginTransmission(addres);
  Wire.write(0x00);
  if (sec < 0) {
    temp = timeStruct -> seconds;
  } else {
    temp = sec;
  }
  Wire.write(decToBcd(temp));
  if (minut < 0) {
    temp = timeStruct -> minutes;
  } else {
    temp = minut;
  }
  Wire.write(decToBcd(temp));
  if (hou < 0) {
    temp = timeStruct -> Hours;
  } else {
    temp = hou;
  }
  Wire.write(decToBcd(temp));
  if (daW < 0) {
    temp = timeStruct -> weekday;
  } else {
    temp = daW;
  }
  Wire.write(decToBcd(temp));
  if (dat < 0) {
    temp = timeStruct -> day;
  } else {
    temp = dat;
  }
  Wire.write(decToBcd(temp));
  if (mo < 0) {
    temp = timeStruct -> month;
  } else {
    temp = mo;
  }
  Wire.write(decToBcd(temp));
  if (ye < 0) {
    temp = timeStruct -> year;
  } else {
    temp = ye;
  }
  Wire.write(decToBcd(temp));
  Wire.endTransmission();
  timeStruct ->startTime = millis() - 1000;
}
void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct)
{
  if (!(_isTimer ((timeStruct ->startTime), 250))) {
    return;
  }
  Wire.beginTransmission( addres);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(addres, 7);
  if (Wire.available()) {
    byte  seconds = Wire.read();
    byte minutes = Wire.read();
    byte hours   = Wire.read();
    byte day     = Wire.read();
    byte date    = Wire.read();
    byte month   = Wire.read();
    byte year    = Wire.read();
    timeStruct -> seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111));
    timeStruct -> minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111));
    timeStruct -> Hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111));
    timeStruct -> weekday = (day & B00000111);
    timeStruct -> day    = (((date & B00110000) >> 4) * 10 + (date & B00001111));
    timeStruct -> month   = (((month & B00010000) >> 4) * 10 + (month & B00001111));
    timeStruct -> year    = (((year & B11110000) >> 4) * 10 + (year & B00001111));
  } timeStruct ->startTime = millis();
}
String _convertRealTimeClockNumberToString(byte value)
{
  if (value > 9) {
    return String(value, DEC);
  }
  return (String("0") + String(value, DEC));
}

Credits

Владимир Сарана
0 projects • 0 followers
Contact

Comments

Please log in or sign up to comment.