GREENBIT - få det att växa (INTEL IOT) (9 / 13 steg)
Steg 9: Arduino skiss
Arduino skiss
#include
#include
#include
#include
#include
#include
#include "rgb_lcd.h"
rgb_lcd lcd;
att vissa anpassade tecken:
byte hjärtat [8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
byte smiley [8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b10001,
0b01110,
0b00000
};
byte armsDown [8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp [8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
Definiera makron
#define DEBUG 1
Analoga Pins Definition
CONST int ljus = 0;
CONST int temp = 1;
CONST int fukt = 2;
CONST int vattenflöde = 3;
Digital Pins Definition
CONST int touch = 2;
CONST int bulbRelay = 4;
CONST int fanRelay = 7.
CONST int pump = 8.
CONST int ledPin = 13.
IPC pins
int notifier_pin = 3;
int js_subscriber_pin = 6;
Fil * fromarduino, * toarduino;
int jag = 0;
int c;
Timer
osignerade långa timeOut = 0;
bool newdata = false;
int showType = 0;
int mapLight;
int mapTemp;
int mapMoisture;
Sträng lightString;
Sträng tempString;
Sträng moistureString;
int B = 3975;
char charVal [10].
char ipcString [200].
Touch Bool
booleska touchStarted = false;
booleska tweetState = false;
String plantName = "";
String lightState = "";
char * incomingString;
char * splitVal;
Sträng input = "";
int counter = 0;
int lastIndex = 0;
CONST int numberOfPieces = 6;
Sträng bitar [numberOfPieces];
Funkion skriva ut fel
void printError(char *str)
{
Serial.Print ("fel:");
Serial.println(Str);
}
void setup()
{
Serial.BEGIN(115200);
pinMode (ljus, indata);
pinMode (temp, mata);
pinMode (fukt, ingång);
pinMode (vattenflöde, ingång);
pinMode (bulbRelay, produktionen);
pinMode (fanRelay, produktionen);
pinMode (pump, OUTPUT);
pinMode (ledPin, produktionen);
pinMode (notifier_pin, produktionen);
pinMode (js_subscriber_pin, INPUT_PULLUP);
Ange den LCD antal kolumner och rader:
LCD.BEGIN (16, 2);
LCD.Clear();
lcd.setRGB (0, 255, 0);
lcd.createChar (0, hjärta);
lcd.createChar (1, smiley);
lcd.createChar (3, armsDown);
lcd.createChar (4, armsUp);
lcd.setCursor (0, 0);
LCD.write(4);
LCD.write(4);
lcd.setCursor (4, 0);
LCD.Print("GREENBIT");
lcd.setCursor (14, 0);
LCD.write(4);
LCD.write(4);
digitalWrite (bulbRelay, hög);
digitalWrite (fanRelay, hög);
Avbryter initiering
attachInterrupt (touch, touchTweet, förändring);
attachInterrupt (js_subscriber_pin, subscriberEvent, RISING);
Delay(10);
}
void loop()
{
lcd.setCursor (0, 1);
LCD.Print(plantName);
LCD.write(3);
Delay(10);
LCD.write(4);
Delay(10);
int setTemp, setLight, setMoisture;
IF(timeout == 0)
timeOut = millis();
om ((millis()-timeOut) > = 1000)
{
Serial.println("test");
mapLight = analogRead(light);
mapTemp = analogRead(temp);
mapMoisture = analogRead(moisture);
Lätta bearbetning
mapLight = karta (mapLight, 0, 0, 800 100);
Temperaturen bearbetning
flyta floatTemp = (float)(1023-mapTemp) * 10000/mapTemp;
int tempCelsius = 1 / (log (floatTemp/10000) /B+1/298.15)-273.15;
String lightString = String(mapLight);
String tempString = String(tempCelsius);
String moistureString = String(mapMoisture);
Serial.Print(tempCelsius);
Serial.Print(mapLight);
Serial.println(mapMoisture);
String finalString = tempString + "," + moistureString + "," + lightString;
finalString.toCharArray (ipcString, finalString.length()+1);
Serial.println(ipcString);
publishData();
notifyWorld();
Delay(100);
timeOut = millis();
}
Temperaturkontroll
IF(mapTemp > setTemp)
{
göra
{
digitalWrite (fanRelay, hög);
} medan (mapTemp < (setTemp - 5));
}
annat if(mapTemp < setTemp)
{
göra
{
digitalWrite(fanRelay,LOW);
} medan (mapTemp < (setTemp + 5));
}
Ljusreglering
om (lightState == "0")
{
digitalWrite (bulbRelay, låg);
}
annat
digitalWrite (bulbRelay, hög);
Fukt och motorstyrning
IF(mapMoisture > setMoisture)
{
göra
{
digitalWrite (pump, hög).
} medan (mapMoisture < (setMoisture - 5));
}
annat if(mapMoisture < setMoisture)
{
digitalWrite(pump,LOW);
} medan (mapMoisture < (setMoisture + 5));
}
loopen avslutas
ISR
void touchTweet()
{
digitalWrite(ledPin,HIGH);
IF(mapTemp < 20)
{
tweetState = 1;
lcd.setRGB (200, 0, 0);
lcd.setCursor (0, 1);
LCD.write ((unsigned char) 0);
lcd.setCursor (3, 1);
LCD.Print ("Jag är SAD");
}
annat
{
tweetState = 0;
lcd.setRGB (0, 200, 0);
lcd.setCursor (0, 1);
LCD.Print ("ljus:");
LCD.Print(mapLight);
för (int positionCounter = 0; positionCounter < 13; positionCounter ++)
{
Bläddra en position åt vänster:
lcd.scrollDisplayLeft();
Delay(150);
}
lcd.setCursor (2, 1);
LCD.Print("I");
lcd.setCursor (4, 1);
LCD.write ((unsigned char) 0);
lcd.setCursor (6, 1);
LCD.Print("GREENBIT");
}
Serial.println ("Touch upptäckt!");
}
Läsa meddelande från js anmälningshandlingar
void subscriberEvent() {
toarduino = fopen("/home/root/ipc_codes/js_notification_out.txt","r"); Öppna meddelandet från JS
om (toarduino)
{
medan ((c = getc(toarduino))! = EOF)
{
om (c! = 10) //new linje
{
Serial.Print((Char)c);
}
}
Serial.println("");
Serial.println("---");
fclose(toarduino);
}
}
void publishData()
{
fromarduino = fopen ("/ home/root/ipc_codes/arduino_notification_out.txt", "w +");
fprintf (fromarduino, "[%s]", ipcString);
fclose(fromarduino);
}
Nofity något organ ansluten till detta avbrott (C++-program och NodeJS) program
void notifyWorld()
{
digitalWrite (notifier_pin, hög);
Delay(100);
digitalWrite (notifier_pin, låg);
}
Skriva ut data på seriell övervaka och justera sensorn värden upp till 3 siffror
void print_data(int val)
{
int new_val;
IF(val<0)
new_val = 0;
annat if(val>255)
new_val = 255;
annat new_val = val;
IF(new_val<10)
{
Serial.Print(0);
Serial.Print(0);
Serial.Print(new_val);
}
annars om (new_val > = 10 & & new_val < 100)
{
Serial.Print(0);
Serial.Print(new_val);
}
annat
Serial.Print(new_val);
}