#include <IRremote.h>
#include <Servo.h>
#include <Stepper.h>
#include <DHT.h>
#include <ssd1306.h>
/* #include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_ADDR 0x3D
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT); //, &Wire, OLED_RESET);
*/
#define PIN_RECEIVER 2 // Signal Pin of IR receiver
#define DHTPIN 12 // DHT 22 pin
#define DHTTYPE DHT22 // DHT 22 (AM2302)
float humid; //Stores humidity value
float temp; //Stores temperature value
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
long previousMillis = 0;
long interval = 5000;
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
IRrecv receiver(PIN_RECEIVER);
int command;
String value;
String remoteCode;
Servo arm; // Create a "Servo" object called "arm"
float pos = 10.0; // Variable where the arm's position will be stored (in degrees)
float step = 1.0; // Variable used for the arm's position step
int servoPin = 3;
int Relay1Pin = 4;
uint8_t Relay1Value = LOW;
int Relay2Pin = 5;
uint8_t Relay2Value = LOW;
int Relay3Pin = 6;
uint8_t Relay3Value = LOW;
int Relay4Pin = 7;
uint8_t Relay4Value = LOW;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); // Any baud rate should work
while (!Serial); // wait for serial port to connect. Needed for native USB
Serial.println(F("Hello Arduino\n"));
/*SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay(); */
receiver.enableIRIn(); // Start the receiver
arm.attach(servoPin); // Attache the arm to the pin 2
arm.write(pos); // Initialize the arm's position to 0 (leftmost)
pinMode(servoPin, OUTPUT);
myStepper.setSpeed(60);
pinMode(Relay1Pin, OUTPUT);
digitalWrite(Relay1Pin, Relay1Value);
pinMode(Relay2Pin, OUTPUT);
digitalWrite(Relay2Pin, Relay2Value);
pinMode(Relay3Pin, OUTPUT);
digitalWrite(Relay3Pin, Relay3Value);
pinMode(Relay4Pin, OUTPUT);
digitalWrite(Relay4Pin, Relay4Value);
dht.begin();
ssd1306_128x64_i2c_init();
//ssd1306_128x32_i2c_init();
}
void(* resetFunc) (void) = 0;//declare reset function at address 0
void loop() {
// put your main code here, to run repeatedly:
// Checks received an IR signal
if (receiver.decode()) {
translateIR();
command = receiver.decodedIRData.command;
receiver.resume(); // Receive the next value
//Serial.println(receiver.decodedIRData.command);
//Serial.println(receiver.decodedIRData.decodedRawData);
//Serial.println(receiver.decodedIRData.decodedRawData, HEX);
remoteCode = translateIR();
Serial.println(remoteCode);
// Send string value from translateIR. Keep it a lenght of five.
// Send this value with 433 MHz transmitter
switch (command) {
//MINUS
case 152:
pos -= step;
if (pos < 0) pos = 0;
arm.write(pos);
Serial.println("Position: " + String(pos));
myStepper.step(-1);
break;
// PLUS
case 2:
pos += step;
if (pos > 180) pos = 180;
arm.write(pos);
Serial.println("Position: " + String(pos));
myStepper.step(1);
break;
// PREV
case 224:
pos -= 10;
if (pos < 0) pos = 0;
arm.write(pos);
Serial.println("Position: " + String(pos));
myStepper.step(-10);
break;
// NEXT
case 144:
pos += 10;
if (pos > 180) pos = 180;
arm.write(pos);
Serial.println("Position: " + String(pos));
myStepper.step(10);
break;
// num 0
case 104:
// reset all relays to off
arm.write(0);
Serial.println("Position: " + String(pos));
Relay1Value = LOW;
digitalWrite(Relay1Pin, Relay1Value);
delay(40);
Relay2Value = LOW;
digitalWrite(Relay2Pin, Relay2Value);
delay(40);
Relay3Value = LOW;
digitalWrite(Relay3Pin, Relay3Value);
delay(40);
Relay4Value = LOW;
digitalWrite(Relay4Pin, Relay4Value);
delay(40);
break;
// num 1
case 48:
Relay1Value = !Relay1Value;
Serial.println(Relay1Value);
digitalWrite(LED_BUILTIN, Relay1Value);
digitalWrite(Relay1Pin, Relay1Value);
delay(20);
break;
// num 2
case 24:
Relay2Value = !Relay2Value;
Serial.println(Relay2Value);
digitalWrite(LED_BUILTIN, Relay2Value);
digitalWrite(Relay2Pin, Relay2Value);
delay(20);
break;
// num 3
case 122:
Relay3Value = !Relay3Value;
Serial.println(Relay3Value);
digitalWrite(LED_BUILTIN, Relay3Value);
digitalWrite(Relay3Pin, Relay3Value);
delay(20);
break;
// num 4
case 16:
Relay4Value = !Relay4Value;
Serial.println(Relay4Value);
digitalWrite(LED_BUILTIN, Relay4Value);
digitalWrite(Relay4Pin, Relay4Value);
delay(20);
break;
// reest arduino with power button
case 162:
Serial.println("Power / Reset");
delay(30);
resetFunc(); //call reset
break;
}
}
//delay(40);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval){
previousMillis = currentMillis;
CheckTemp();
}
}
void CheckTemp()
{
Serial.println("temperature check");
//delay(2000);
//Read data and store it to variables hum and temp
humid = dht.readHumidity();
temp= dht.readTemperature();
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
//Print temp and humidity values to serial monitor
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
ssd1306_setFixedFont(ssd1306xled_font6x8);
ssd1306_clearScreen();
// Create const char for humidity then display to OLED
char resultH[8]; // Buffer big enough for 7-character float
dtostrf(h, 6, 2, resultH); // Leave room for too large numbers!
char bufH[30];
const char *firstH = "Humidity ";
const char *secondH = resultH;
const char *thirdH = "%";
strcpy(bufH,firstH);
strcat(bufH,secondH);
strcat(bufH,thirdH);
ssd1306_printFixed(0, 0, bufH, STYLE_NORMAL);
// Create const char for Temperature then display to OLED
char resultT[6]; // Buffer big enough for 7-character float
dtostrf(f, 5, 1, resultT); // Leave room for too large numbers!
char resultTc[6]; // Buffer big enough for 7-character float
dtostrf(t, 5, 1, resultTc); // Leave room for too large numbers!
char bufT[36];
const char *firstT = "Temp ";
const char *secondT = resultT;
const char *thirdT = " F ";
const char *fourthTc = resultTc;
const char *fifthTc = " C ";
strcpy(bufT,firstT);
strcat(bufT,secondT);
strcat(bufT,thirdT);
strcat(bufT,fourthTc);
strcat(bufT,fifthTc);
ssd1306_printFixed(0, 10, bufT, STYLE_NORMAL);
// Create const char for Heat Index then display to OLED
char resultHIF[14]; // Buffer big enough for 7-character float
dtostrf(hif, 5, 1, resultHIF); // Leave room for too large numbers!
char bufHIF[30];
const char *firstHIF = "Feels Like ";
const char *secondHIF = resultT;
const char *thirdHIF = " F";
strcpy(bufHIF,firstHIF);
strcat(bufHIF,secondHIF);
strcat(bufHIF,thirdHIF);
ssd1306_printFixed(0, 20, bufHIF, STYLE_NORMAL);
//ssd1306_print(resultT);
//ssd1306_printFixed(0, 24, "Italic text", STYLE_ITALIC);
//ssd1306_negativeMode();
//ssd1306_printFixed(0, 32, "Inverted bold", STYLE_BOLD);
//ssd1306_positiveMode();
}
String translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
value = "POWER";
break;
case 226:
value = "MENU";
break;
case 34:
value = "TEST";
break;
case 2:
value = "PLUS";
break;
case 194:
value = "BACK";
break;
case 224:
value = "PREV";
break;
case 168:
value = "PLAY";
break;
case 144:
value = "NEXT";
break;
case 104:
value = "num 0";
break;
case 152:
value = "MINUS";
break;
case 176:
value = "key C";
break;
case 48:
value = "num 1";
break;
case 24:
value = "num 2";
break;
case 122:
value = "num 3";
break;
case 16:
value = "num 4";
break;
case 56:
value = "num 5";
break;
case 90:
value = "num 6";
break;
case 66:
value = "num 7";
break;
case 74:
value = "num 8";
break;
case 82:
value = "num 9";
break;
default:
value = "other " + receiver.decodedIRData.command;
}
return value;
}
/*void translateIR()
{
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
case 162:
lcdPrint("POWER");
break;
case 226:
lcdPrint("MENU");
break;
case 34:
lcdPrint("TEST");
break;
case 2:
lcdPrint("PLUS");
break;
case 194:
lcdPrint("BACK");
break;
case 224:
lcdPrint("PREV.");
break;
case 168:
lcdPrint("PLAY");
break;
case 144:
lcdPrint("NEXT");
break;
case 104:
lcdPrint("num: 0");
break;
case 152:
lcdPrint("MINUS");
break;
case 176:
lcdPrint("key: C");
break;
case 48:
lcdPrint("num: 1");
break;
case 24:
lcdPrint("num: 2");
break;
case 122:
lcdPrint("num: 3");
break;
case 16:
lcdPrint("num: 4");
break;
case 56:
lcdPrint("num: 5");
break;
case 90:
lcdPrint("num: 6");
break;
case 66:
lcdPrint("num: 7");
break;
case 74:
lcdPrint("num: 8");
break;
case 82:
lcdPrint("num: 9");
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print(" other button");
}
}
void lcdPrint(char* text)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("button pressed:");
lcd.setCursor(0, 1);
lcd.print(text);
lcd.print(" code: ");
lcd.print(receiver.decodedIRData.command);
}
*/