1 Konsepto ng aparato
Ang layunin ng pag-unlad na ito ay upang mangolekta ng data mula sa mga lokal na sensor, ipadala ang data na ito sa Internet. Makikita ng gumagamit ang data na nagmula sa mga sensor saanman sa mundo at gumawa ng isang malayong pagpapasya sa pag-activate ng ilang mga actuators na matatagpuan sa lokal, sa tabi ng mga sensor
Gumagamit ang proyekto Arduino UNO at WiFi module ESP8266-01. Ang data ay maipapadala sa ulap sa pamamagitan ng serbisyo sa web ng ThingSpeak.com, at ang mga aparato ay isasaktibo sa pamamagitan ng android application na binuo gamit ang MIT AppInventor.
Ang IoT ay isang konsepto ng isang computer network ng mga pisikal na bagay ("mga bagay") na nilagyan ng mga built-in na teknolohiya para sa pakikipag-ugnay sa bawat isa o sa panlabas na kapaligiran, isinasaalang-alang ang samahan ng mga naturang network bilang isang kababalaghan na maaaring makapagpabago ng mga pang-ekonomiyang at panlipunan na proseso, maalis ang pangangailangan para sa pakikilahok ng tao mula sa bahagi ng mga aksyon at operasyon.
Ang pangunahing pokus ng proyektong IoT na ito ay ang serbisyo ng ThingSpeak.com. Ang lokal na aparato ng UNO / ESP-01 ay tumatanggap ng data mula sa mga sensor at data sa katayuan ng mga actuators, ipinapadala ito sa "recording" sa Internet sa pamamagitan ng isang tiyak na channel ng katayuan ng ThingSpeak.com (ThingSpeak.com Status Channel), ang parehong lokal na aparato ay tumatanggap ng data, " pagbabasa "ang mga ito mula sa isa pang channel ng data -" ang channel ng mga executive aparato "(ThingSpeak.com Actuator Channels).
Ang data ay makokolekta gamit ang isang temperatura at kamag-anak na sensor ng halumigmig, temperatura ng lupa at halumigmig, at isang nakapaligid na sensor ng ilaw. Ang data na ito ay ipapadala sa cloud service ng ThingSpeak.
Magkakaroon ng dalawang ehekutibong aparato - ito ay isang de-koryenteng electric pump at isang lampara. Ang kanilang ON / OFF na katayuan ay ipapadala din sa ulap. Halimbawa, ang data mula sa mga sensor, ay maaaring ipakita ang kasalukuyang estado ng isang greenhouse o greenhouse. Kontrolin ng gumagamit ang mga aparato ng ehekutibo gamit ang android application.
2 Listahan ng mga kinakailangang sangkap
Ang lahat ng mga link ay para sa mga layuning pang-impormasyon lamang.
2 x LEDs (pula at berde)
1 x
- $3.00
220V lampara
2 x 330 ohm risistor (ginamit sa mga LED)
2 x 10K ohm risistor (ginamit sa DHT22 at LDR)
1 x 4K7 ohm risistor (ginamit sa DS18B20)
Breadboard
Mga Jumper
Panlabas na supply ng kuryente para sa relay 5V DC
3 bahagi ng bakal
Ngayon kailangan mong ikonekta ang lahat ng mga sensor, tulad ng ipinapakita sa diagram.
Ang perpektong solusyon ay upang magtipon at subukan ang proyekto sa mga bahagi.
Sa sumusunod na pagkakasunud-sunod:
1. I-install at subukan ang lahat ng mga sensor
2.I-install at minimum na i-configure ang ESP-01
3. Baguhin ang ESP-01 setup sa panghuling pagsasaayos at pagsubok
4. I-configure ang ThingSpeak Status Channel
5. I-install ang ThingSpeak code sa Arduino at suriin ang katayuan ng mga sensor sa ulap
6. Buuin ang unang bersyon ng programa sa android upang suriin ang mga mensahe ng katayuan mula sa mga sensor
7. I-install ang mga actuators
8. I-configure ang mga channel ng ThingSpeak Actuator
9. I-install at pagsubok code para sa mga executive aparato sa Arduino
10. Gumawa ng pangalawang bersyon ng programa sa android para sa buong pagpupulong ng aparato.
4 na Koneksyon ng Sensor
Gumagamit ang proyekto ng ilang mga aklatan na kasama. Ito ay kinakailangan upang suriin ang kanilang kakayahang magamit. Ang paunang pagsasaayos ng mga aklatang ito ay ang mga sumusunod:
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 sa pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int lupaTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (Liwanag)
#define ldrPIN 1
int light = 0;
// Kahalumigmigan ng lupa
#define groundHumPIN 0
int lupaHum = 0;
Ngayon sinisimulan namin ang aming mga sensor at ipinapakita ang mga ito sa terminal:
walang pag-setup ()
{
Serial.begin (9600);
DS18B20.begin ();
dht.begin ();
}
walang bisa loop ()
{
basahinSensors ();
displaySensors ();
pagkaantala (10000);
}
At sa wakas, magsusulat kami ng dalawang pag-andar: binabasa ng isa ang mga pagbasa mula sa mga sensor, at ipinapakita ang iba pang mga ito sa screen:
/ ********* Basahin ang halaga ng Sensor ************* /
walang bisa ReadSensors (walang bisa)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperature ();
lupaTemp = DS18B20.getTempCByIndex (0); // Ang Sensor 0 ay kukuha ng Lupa ng Templo sa Celcius
lupaHum = mapa (analogRead (lupaHumPIN), 1023, 0, 0, 100);
ilaw = mapa (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ilaw 100%
}
/ ********* halaga ng Pagpapakita ng Sensor ************* /
walang bisa na displaySensors (walang bisa)
{
Serial.print ("airTemp (oC):");
Serial.println (airTemp);
Serial.print ("airHum (%):");
Serial.println (airHum);
Serial.print ("groundTemp (oC):");
Serial.println (groundTemp);
Serial.print ("groundHum (%):");
Serial.println (lupaHum);
Serial.print ("ilaw (%):");
Serial.println (ilaw);
Serial.println ("");
}
Ipinapakita ng larawan kung paano ipinapakita ang data sa screen.
Maaaring ma-download ang source code mula sa may-akda.
4 na pangunahing pagsasaayos ng ESP8266-01
Ang pinakamabilis na paraan upang "makipag-usap" sa module ay ang AT utos. Ang processor ay mayroon nang AT command processor. Bilang default, ang module ay may mga setting ng pabrika ng 115200 baud, kailangan mong itakda ang 9600 baud sa mga setting.
Una, kailangan mong ikonekta ang module, tulad ng ipinapakita sa larawan
( Tandaan na ang Tx terminal ng ESP-01 ay konektado sa Tx terminal ng UNO, tulad ng mga terminal ng Rx ay konektado sa bawat isa. Ang koneksyon na ito ay mababago mamaya. ).
Pagkatapos ay ikonekta ang UNO sa computer, buksan ang IDE at i-download ang halimbawa na matatagpuan. Ito ay walang laman na code upang walang mga tunggalian sa pagitan ng ESP-01 at UNO. Ang code na ito ay nai-upload sa Ardunio bago kumonekta sa ESP-01 dito, upang matiyak na hindi gagamitin ni Ardunio ang mga Tx at Rx pin para sa anumang bagay.
Ngayon ay kailangan mong buksan ang IDE Serial Monitor, itakda ang rate ng baud sa 115200 sa mga setting at ipadala ang utos ng AT sa IDE Serial Monitor. Ang ESP-01 ay dapat magpadala ng sagot na OK
Ngayon ay kailangan mong baguhin ang rate ng data sa module ng ESP-01. Upang gawin ito, sa IDE, ibigay ang utos
AT + CIOBAUD = 9600
Maaaring mangyari na ang ESP-01 ay bumalik sa mga setting ng pabrika, kung gayon kakailanganin mong gumamit ng isa pang utos:
AT + UART_DEF = , , , ,
Halimbawa 9600 baud / 8 data bits / 1 stop bits at walang pagkakapare-pareho at kontrol ng daloy
AT + UART_DEF = 9600,8,1,0,0
Ngayon baguhin ang rate ng paglipat ng data sa mga setting ng IDE sa 9600 at ipadala ang utos ng AT, dapat na dumating ang OK na sagot.
Susunod, kailangan mong ilipat ang module sa mode ng STA upang maaari itong kumonekta sa access point ng iyong network.
AT + CWMODE = 1
Para sa module na kumonekta sa network, ipasok ang utos AT + CWJAP = "network_name", "network_name_1"saan network_name Ang pangalan ba ng iyong network, at network_name_1 - password para sa iyong network (password at pangalan ng network ay dapat na nasa mga marka ng sipi)
Kung nakikita mo ang sagot WIFI KONKOLIKO WIFI GOT IP, pagkatapos ay itinatag ang koneksyon. Suriin ang IP address gamit ang utos
AT + CIFSR
. Ang address na lilitaw sa iyong monitor, maaari mong gamitin sa hinaharap. Kapag na-configure mo ang modyul, maaari mo itong ikonekta nang permanente, ngunit para dito kailangan mong baguhin ang switch circuit nito, tulad ng ipinapakita sa figure.
• ESP-01 RX (Dilaw) -> UNO Pin D7
• ESP-01 TX (Orange) -> UNO Pin D6
• ESP-01 Ch-Pd (Kayumanggi) -> Vcc (3.3V)
• ESP-01 I-reset (Blue) -> UNO Pin D8
• ESP-01 Vcc (Pula) -> 3.3V
• ESP-01 Gnd (Itim) -> UNO GND
Tandaan na ang Software Serial library ay gumagamit ng UNO Pin D7 pin tulad ng tx at kumokonekta ito sa output ng ESP-01 Rxhabang UNO Pin D6 tulad ng rxkonektado sa ESP-01 TX.
Maglagay ng isang maliit na code upang masuri ang tamang koneksyon at pagsasaayos ng ESP-01 module
#include
SoftwareSerial esp8266 (6.7); // Rx ==> Pin 6; TX ==> Pin7
#define bilis8266 9600
walang pag-setup ()
{
esp8266.begin (bilis8266);
Serial.begin (bilis8266);
Serial.println ("ESP8266 Setup test - gumamit ng AT coomands");
}
walang bisa loop ()
{
habang (esp8266.Magagamit ())
{
Serial.write (esp8266.read ());
}
habang (Serial.available ())
{
esp8266.write (Serial.read ());
}
}
Ngayon ng ilang AT team. Tingnan ang mga resulta sa Serial Monitor.
* AT =====> bumalik ang OK ng ESP8266
* AT + RST =====> I-restart ang ESP8266 at bumalik ang OK
* AT + GMR =====> Ang ESP8266 ay bumalik sa Bersyon; Bersyon ng SDK; id; Ok
* AT + CWMODE? => ESP8266 ibalik ang uri ng mode
* AT + CWLAP ===> Ibinalik ng ESP8266 ang mga malapit na access point
* AT + CIFSR ===> Ang ESP8266 ay nagbabalik ng itinalagang IP
Maaaring ma-download ang code ng programa sa
6 na koneksyon ng mga sensor at ESP-01
Matapos ang lahat ng mga sensor ay konektado at naka-check, pati na rin ang module ng ESP-01, kinakailangan upang ihanda ang data para sa pagpapadala sa Internet.
7 ThingSpeak
Ang isa sa pinakamahalagang bahagi ng proyekto ay ang bukas na platform ng IoT, na magbibigay-daan sa iyo upang mangolekta ng data mula sa mga sensor, iproseso at pag-aralan ang mga ito. Upang gawin ito, pumunta sa at lumikha ng iyong account. Susunod, kailangan mong lumikha ng isang channel kung saan magkakaroon ng 2 mga artista, 5 sensor at isang backup na patlang.
• Patlang 1: Actuator 1 (aparato 1)
• Patlang 2: Actuator 2 (aparato 2)
• Patlang 3: temperatura ng hangin sa oC (temperatura ng hangin sa degree Celsius)
• Na-file 4: Air Relative Humidity sa% (Relatibong kahalumigmigan sa%)
• Patlang 5: temperatura ng lupa sa oC (temperatura ng lupa sa gr. Celsius)
• Patlang 6: Kahalumigmigan sa lupa sa% (kahalumigmigan ng lupa sa%)
• Patlang 7: Luminosity sa% (pag-iilaw sa%)
• Patlang 8: Spare
Ang patlang 8 ay nakalaan para sa pagpapalawak sa hinaharap o para sa pag-debug. Sa proyektong ito, ginagamit ito bilang isang counter ng error sa komunikasyon sa pagitan ng Arduino / ESP-01 at ThingSpeak.com.
Kapag nilikha mo ang Status Channel, kailangan mong i-record ang mga key, tulad ng ipinapakita sa larawan.
8 Nagpapadala ng katayuan sa sensor sa ulap
Sa ngayon, mayroon kaming isang naka-configure na serbisyo sa ulap at kinokolekta ng aming mga sensor ang data sa lokal. Ngayon ay kailangan mong dalhin ang data na ito at ipadala ito sa ulap sa ThingSpeak.com.
Upang makapagsulat ng data sa ThingSpeak channel, kailangan mong magpadala ng isang string ng GET. Gagawin ito sa tatlong yugto.
Ipadala ang utos na "Start cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
Ang karagdagang haba ng string
AT + CIPSEND = 116
At sa wakas, isang string ng GET na magsusulat ng aming data sa mga patlang na Status Channel.
GET / update? Api_key = Your_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = groundTemp & field6 = groundHum & field7 = light & field8 = ekstrang
Mangyaring tandaan na hindi namin dapat isulat ang data sa channel nang higit sa 1 oras sa 16 segundo.
Gagawin ang naisumite na code.
// Thingspeak
Katayuan ng StringChWriteKey = "IYONG WRITE KEY DITO"; // Status Channel id: 385184
#include
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// DS18B20
#include
#include
#define ONE_WIRE_BUS 5 // DS18B20 sa pin D5
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
int lupaTemp = 0;
// DHT
#include "DHT.h"
#include
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht (pinoDHT, tipoDHT);
int airTemp = 0;
int airHum = 0;
// LDR (Liwanag)
#define ldrPIN 1
int light = 0;
// Kahalumigmigan ng lupa
#define groundHumPIN 0
int lupaHum = 0;
// Mga variable na gagamitin sa mga timer
mahabang pagsusulatTimingSeconds = 17; // ==> Tukuyin ang Sample ng oras sa mga segundo upang magpadala ng data
mahabang panimulaWriteTiming = 0;
mahaba na lumipasWriteTime = 0;
// Mga variable na gagamitin sa Actuator
boolean pump = 0;
boolean lamp = 0;
int ekstrang = 0;
error sa boolean;
walang pag-setup ()
{
Serial.begin (9600);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (HARDWARE_RESET, HIGH);
DS18B20.begin ();
dht.begin ();
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // I-reset ang gawin ang Modulo WiFi
startWriteTiming = millis (); // nagsisimula ang "orasan ng programa"
}
walang bisa loop ()
{
simulan: // label
error = 0;
nataposWriteTime = millis () - startWriteTiming;
kung (elapsedWriteTime> (writeTimingSeconds * 1000))
{
basahinSensors ();
isulatThingSpeak ();
startWriteTiming = millis ();
}
kung (error == 1) // Ipadala kung ang paghahatid ay hindi nakumpleto
{
Serial.println ("<<<< ERROR >>>>");
pagkaantala (2000);
pagsisimula ng goto; // pumunta sa label na "magsimula"
}
}
/ ********* Basahin ang halaga ng Sensor ************* /
walang bisa ReadSensors (walang bisa)
{
airTemp = dht.readTemperature ();
airHum = dht.readHumidity ();
DS18B20.requestTemperature ();
lupaTemp = DS18B20.getTempCByIndex (0); // Ang Sensor 0 ay kukuha ng Lupa ng Templo sa Celcius
ilaw = mapa (analogRead (ldrPIN), 1023, 0, 0, 100); // LDRDark: 0 ==> ilaw 100%
lupaHum = mapa (analogRead (lupaHumPIN), 1023, 0, 0, 100);
}
/ ********* Conexao com TCP com Thingspeak ******* /
walang bisa pagsulatThingSpeak (walang bisa)
{
pagsisimulaThingSpeakCmd ();
// preparacao da string GET
String getStr = "GET / update? Api_key =";
getStr + = katayuanChWriteKey;
getStr + = "& field1 =";
getStr + = String (pump);
getStr + = "& field2 =";
getStr + = String (lampara);
getStr + = "& field3 =";
getStr + = String (airTemp);
getStr + = "& field4 =";
getStr + = String (airHum);
getStr + = "& field5 =";
getStr + = String (groundTemp);
getStr + = "& field6 =";
getStr + = String (groundHum);
getStr + = "& field7 =";
getStr + = String (ilaw);
getStr + = "& field8 =";
getStr + = String (ekstrang);
getStr + = "\ r \ n \ r \ n";
sendThingSpeakGetCmd (getStr);
}
/ ********* I-reset ang ESP ************* /
walang bisa EspHardwareReset (walang bisa)
{
Serial.println ("Pag-reset ng .......");
digitalWrite (HARDWARE_RESET, LOW);
pagkaantala (500);
digitalWrite (HARDWARE_RESET, HIGH);
pagkaantala (8000); // Tempo necessário para começar a ler
Serial.println ("RESET");
}
/ ********* Simulan ang komunikasyon sa ThingSpeak ************* /
walang bisa pagsisimulaThingSpeakCmd (walang bisa)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
Serial.println (cmd);
kung (EspSerial.find ("Error"))
{
Serial.println ("AT + CIPSTART error");
bumalik
}
}
/ ********* magpadala ng isang GET cmd sa ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = String (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> lenght cmd:");
Serial.println (cmd);
kung (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
pagkaantala (500); // tempo para sa processar o GET, sem este antala apresenta abala walang próximo comando
String messageBody = "";
habang (EspSerial.available ())
{
String line = EspSerial.readStringUntil ('\ n');
kung (line.length () == 1)
{// aktwal na nilalaman ay nagsisimula pagkatapos ng walang laman na linya (na may haba 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("Natanggap ang MessageBody:");
Serial.println (messageBody);
bumalik na mensaheBody;
}
iba pa
{
EspSerial.println ("AT + CIPCLOSE"); // alerto ng gumagamit
Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // I-resend ...
ekstrang = ekstrang + 1;
error = 1;
ibalik ang "error";
}
}
Maaari mong makita ang pag-unlad sa Serial Monitor.
Maaaring ma-download ang source code sa
9 android app - bahagi ng isa
Una kailangan mong lumikha ng isang interface ng gumagamit. Ipinapakita ng larawan ang pangunahing nakikita at hindi nakikita elemento.
Pagkatapos nito, kailangan mong lumikha ng mga bloke. Ang mga item sa menu ay tumutugma sa mga numero ng screenshot.
1 Ang mga variable ng estado na dapat ipahayag bilang global
2 Bawat dalawang segundo (depende sa Clock1) isang pamamaraan ay tinatawag "basahinArduino"
Ibinalik ng pamamaraan ang halaga ng mga variable na dapat ipakita sa screen. Sa kasong ito, ang halaga ng estado (0 at 1) para sa mga aktor ay na-convert sa "ON" at "OFF" para sa mas mahusay na pagdama.
Ang mga halagang ito (Katayuan) ay ipapakita sa kaukulang "Mga Shortcut"
3 Ang pagbabasaArduino na gawain ay mahalagang basahin ang status channel sa ThingSpeak. Kaya, kailangan mong matukoy ang URL na ipapadala sa Thingspeak. Upang gawin ito, 3 pandaigdigang variable ay dapat ipahayag at pagsamahin upang lumikha ng URL na maipadala sa ThingSpeak. Ang GET ay dapat ipadala sa isang bahagi ng web na tinatawag "ArduFarmBotStatusCh"
4 Ang tekstong natanggap mula sa naunang utos ay darating sa format na JSon. Kailangang maiproseso ang tekstong ito upang mabasa ang bawat larangan at maiimbak sa kaukulang pandaigdigang variable.
5 Ang huling bagay na dapat gawin ay tawagan ang "Alarm" na pamamaraan, na susuriin ang estado ng dalawang sensor ng lupa. Kung ang temperatura ay masyadong mababa (sa aming kaso 10oC), dapat ipakita ang isang mensahe. Ang parehong para sa kahalumigmigan kung ito ay mas mababa sa 60%.
Mangyaring tandaan na tinukoy namin ang isa pang timer (Clock2), na-program upang patakbuhin ito bawat segundo. Kinakailangan lamang na "lumipat" ng kulay ng teksto ng mensahe (mula puti hanggang pula). Magkislap ang mensahe.
Maaaring ma-download ang application code sa
10 Koneksyon ng mga aktor
Mga utos para sa pag-on ng bomba at lampara at off ay tatanggap ng malayuan. Ang output ni Ardunio ay buhayin ang relay at LED, na kumukuha ng mga utos na ito. Ipinapakita ng larawan kung paano dapat kumonekta ang mga actuators. Mangyaring tandaan na ang output ng relay ng GND HINDI NILALAMAN sa output ng GNDUNO. Sa ganitong paraan magkakaroon ng mas kaunting pagkagambala ng kuryente kapag tumatakbo ang relay.
11 pagsasaayos ng mga actuators ng channel (Actuators Channels)
Inulit ng lahat ng mga aksyon ang pamamaraan para sa pag-configure ng channel ng Katayuan. Kinakailangan na lumikha ng dalawang mga channel para sa bawat isa sa mga aparato. Para sa bawat channel, isulat ang Channel ID, Basahin at Isulat ang mga key. Magsusulat lamang kami sa unang larangan ng bawat channel. Para sa isang halimbawa:
Channel ID 375598 ==> LED Red (Pump)
◦ Field1 = 0 ==> Pump OFF
◦ Patlang1 = 1 ==> Pump ON
2. Channel ID 375599 ==> LED Green (Lamp)
◦ Field1 = 0 ==> Lampas na OFF
◦ Field1 = 1 ==> Lampas ON
11 paglo-load at pagsubok code actuators sa Ardunio.
Kapag nagpadala kami ng data sa ulap, "isinulat" namin ang data na ito sa ThingSpeak. Ngayon kailangan nating "basahin" ang data mula sa Actuator Channel, "pagtanggap" (pag-download) ng data na ito.
Upang gawin ito, magpadala ng isang string ng GET at ang pamamaraang ito ay binubuo ng 3 yugto.
"Simulan ang cmd"
AT + CIPSTART = "TCP", "184.106.153.149", 80
Haba ng linya
AT + CIPSEND = 36
At ang GET string mismo
GET / channel / 375598 / mga patlang / 1 / huling
Ang mga Channel ay "mababasa" tuwing 10 segundo
Matapos ipadala ang GET, dapat nating tanggapin ang tugon mula sa ThingSpeak. Ang sagot ay dapat alinman sa 0 o 1, para sa bawat channel. Kung mayroong anumang iba pang mga halaga, pagkatapos ay balewalain lamang natin sila.
Ang pangunahing pagkakaiba sa pagitan ng bahaging ito at ang nauna ay nasa pag-andar lamang basahinThingSpeak (String channelID)
Nasa ibaba ang code na nagsasagawa ng inilarawan na mga pagkilos.
// Thingspeak
String canalID1 = "999999"; // Actuator1
String canalID2 = "999999"; // Actuator2
#include
SoftwareSerial EspSerial (6, 7); // Rx, Tx
#define HARDWARE_RESET 8
// Mga variable na gagamitin sa mga timer
mahabang pagbasaTimingSeconds = 10; // ==> Tukuyin ang Sample ng oras sa mga segundo upang makatanggap ng data
mahabang startReadTiming = 0;
mahaba na lumipasReadTime = 0;
// Mga Relays
#define ACTUATOR1 10 // RED LED ==> Pump
#define ACTUATOR2 12 // GREEN LED ==> Lamp
boolean pump = 0;
boolean lamp = 0;
int ekstrang = 0;
error sa boolean;
walang pag-setup ()
{
Serial.begin (9600);
pinMode (ACTUATOR1, OUTPUT);
pinMode (ACTUATOR2, OUTPUT);
pinMode (HARDWARE_RESET, OUTPUT);
digitalWrite (ACTUATOR1, HIGH); // o módulo relé é ativo em LOW
digitalWrite (ACTUATOR2, HIGH); // o módulo relé é ativo em LOW
digitalWrite (HARDWARE_RESET, HIGH);
EspSerial.begin (9600); // Comunicacao com Modulo WiFi
EspHardwareReset (); // I-reset ang gawin ang Modulo WiFi
startReadTiming = millis (); // nagsisimula ang "orasan ng programa"
}
walang bisa loop ()
{
simulan: // label
error = 0;
natanggalReadTime = millis () - startReadTiming;
kung (elapsedReadTime> (readTimingSeconds * 1000))
{
int utos = basahinThingSpeak (canalID1);
kung (utos! = 9) pump = utos;
pagkaantala (5000);
utos = basahinThingSpeak (canalID2);
kung (utos! = 9) lampara = utos;
takeActions ();
startReadTiming = millis ();
}
kung (error == 1) // Ipadala kung ang paghahatid ay hindi nakumpleto
{
Serial.println ("<<<< ERROR >>>>");
pagkaantala (2000);
pagsisimula ng goto; // pumunta sa label na "magsimula"
}
}
/ ********* Gumawa ng mga aksyon batay sa Mga Utos ng ThingSpeak ************* /
walang bisa na pagkuhaActions (walang bisa)
{
Serial.print ("Pump:");
Serial.println (pump);
Serial.print ("Lamp:");
Serial.println (lampara);
kung (pump = 1) digitalWrite (ACTUATOR1, LOW);
iba pa digitalWrite (ACTUATOR1, HIGH);
kung (lampara == 1) digitalWrite (ACTUATOR2, LOW);
iba pa digitalWrite (ACTUATOR2, HIGH);
}
/ ********* Basahin ang utos ng Actuator mula sa ThingSpeak ************* /
int readThingSpeak (String channelID)
{
pagsisimulaThingSpeakCmd ();
int utos;
// preparacao da string GET
String getStr = "GET / channel /";
getStr + = channelID;
getStr + = "/ mga patlang / 1 / huling";
getStr + = "\ r \ n";
String messageDown = sendThingSpeakGetCmd (getStr);
kung (messageDown [5] == 49)
{
command = messageDown [7] -48;
Serial.print ("Natanggap ang Utos:");
Serial.println (utos);
}
ibang utos = 9;
bumalik na utos;
}
/ ********* I-reset ang ESP ************* /
walang bisa EspHardwareReset (walang bisa)
{
Serial.println ("Pag-reset ng .......");
digitalWrite (HARDWARE_RESET, LOW);
pagkaantala (500);
digitalWrite (HARDWARE_RESET, HIGH);
pagkaantala (8000); // Tempo necessário para começar a ler
Serial.println ("RESET");
}
/ ********* Simulan ang komunikasyon sa ThingSpeak ************* /
walang bisa pagsisimulaThingSpeakCmd (walang bisa)
{
EspSerial.flush (); // limpa o buffer antes de começar a gravar
String cmd = "AT + CIPSTART = \" TCP \ ", \" ";
cmd + = "184.106.153.149"; // Endereco IP de api.thingspeak.com
cmd + = "\", 80 ";
EspSerial.println (cmd);
Serial.print ("enviado ==> Start cmd:");
Serial.println (cmd);
kung (EspSerial.find ("Error"))
{
Serial.println ("AT + CIPSTART error");
bumalik
}
}
/ ********* magpadala ng isang GET cmd sa ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
String cmd = "AT + CIPSEND =";
cmd + = String (getStr.length ());
EspSerial.println (cmd);
Serial.print ("enviado ==> lenght cmd:");
Serial.println (cmd);
kung (EspSerial.find ((char *) ">"))
{
EspSerial.print (getStr);
Serial.print ("enviado ==> getStr:");
Serial.println (getStr);
pagkaantala (500); // tempo para sa processar o GET, sem este antala apresenta abala walang próximo comando
String messageBody = "";
habang (EspSerial.available ())
{
String line = EspSerial.readStringUntil ('\ n');
kung (line.length () == 1)
{// aktwal na nilalaman ay nagsisimula pagkatapos ng walang laman na linya (na may haba 1)
messageBody = EspSerial.readStringUntil ('\ n');
}
}
Serial.print ("Natanggap ang MessageBody:");
Serial.println (messageBody);
bumalik na mensaheBody;
}
iba pa
{
EspSerial.println ("AT + CIPCLOSE"); // alerto ng gumagamit
Serial.println ("ESP8266 CIPSEND ERROR: RESENDING"); // I-resend ...
ekstrang = ekstrang + 1;
error = 1;
ibalik ang "error";
}
}
Maaari mong i-download ito sa
12 pagpapadala ng mga utos sa mga aparato
Sa yugtong ito, mayroon kaming isang naka-configure na channel ng actuator na binabago ang halaga ng patlang 1 para sa bawat aparato. Dapat nating patunayan na gumagana nang maayos ang mga aparato. Sa pagtatapos ng proyekto, ang isang application ng android ay gagamitin para sa ito, ngunit maaari rin itong gawin sa pamamagitan ng isang browser.
I-on ang bomba (pulang LED)
https://api.thingspeak.com/update?api_key=Saved_channel_key_1&field1=1
Pump off (pulang LED off)
https://api.thingspeak.com/update?api_key=Saved Channel_key_1 & field1 = 0
I-on ang lampara (naka-on ang berdeng LED)
https://api.thingspeak.com/update?api_key=Saved Channel_key_2 & field1 = 1
Patayin ang lampara (berdeng LED off)
https://api.thingspeak.com/update?api_key=Saved Channel_key_2 & field1 = 0
14 Pagtatapos ng programa sa android
Sa nakaraang bahagi, mayroong isang simpleng programa na "basahin" ang data mula sa channel at ipinakita ito sa screen. Ngayon kailangan nating gawin ang programa na "isulat" ang mga utos sa Actuator Channal, upang ang mga utos na ito ay mabasa ng magsusupil at ang lampara na may bomba ay nagtrabaho nang naaayon.
Upang ang gumagamit ay maaaring magpadala ng mga utos, ang application ay magkakaroon ng dalawang mga pindutan para sa bawat aparato. Kung naka-on, asul; kung naka-off, pula.
Sa pamamagitan ng pag-click sa mga pindutan sa application, maaari mong makita ang resulta sa Serial Monitor.
Maaaring ma-download ang code sa
15 Pangwakas na pagpupulong
Sa yugtong ito, mayroong isang kumpletong nakumpletong android application, isang ganap na naipon na bahagi na "bakal", ngunit walang code sa controller na palaging magbasa ng data at magpadala ng mga utos sa ulap. Kailangan mo lamang pagsamahin ang lahat ng mga fragment ng code na nakasulat nang mas maaga. Siyempre, ang code ay may karagdagang mga pagpipilian sa pagpapatunay (halimbawa, kung ang ESP-01 ay nag-freeze). Upang gawin ito, pana-panahon, bago basahin o isulat ang bawat utos, isang utos ng AT ang ipinadala.At kung ang sagot na OK ay hindi nagmula sa modyul, kung gayon ang module ay pilit na muling naka-reboot na programa.
Ang buong code ng proyekto ay maaaring ma-download sa
Sa address maaari kang makakuha ng mga update para sa mga file file.
Maaari mo ring basahin ang mga komento sa link sa pinagmulan, kung ang isang bagay ay hindi malinaw.