Программы созданы в бесплатной среде Arduino IDE (1.8.9) на языке C++, для микроконтроллера Atmega328.
Ссылка на среду - https://www.arduino.cc/en/software
Пояснения к коду:
Через команду Define можно указать номера портов к которым подключены внешние устройства контроллера, не изменяя весь код.
Использована 1 библиотека для работы с DHT11.
Программа занимает менее 2 Кбайт памяти.
Для пульта использовано 3 библиотеки для работы с OLED– дисплеем.
Код программы для платформы:
#define in1 3
#define in2 5
#define in3 6
#define in4 11
#define dhtpin 2
#define resistorpin A0
#define opros_delay 3000
#include <DHT.h>
DHT dht(dhtpin, DHT11);
int osw=0,t=0,wl=0;
String priem="";
int napr=0;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void right() {
analogWrite(in1, 120);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void left() {
digitalWrite(in1, LOW);
analogWrite(in3, 120);
digitalWrite(in2, LOW);
digitalWrite(in4, LOW);
}
void backward() {
digitalWrite(in1, LOW);
analogWrite(in2, 150);
digitalWrite(in3, LOW);
analogWrite(in4, 150);
}
void forward() {
analogWrite(in1, 150);
analogWrite(in3, 150);
digitalWrite(in2, LOW);
digitalWrite(in4, LOW);
}
void stoping() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
long stv=0;
void timerOpros(){
if(millis()-stv>=opros_delay){
stv=millis();
osw=map(analogRead(resistorpin),0,1023,0,100);
wl=dht.readHumidity();
t=dht.readTemperature();
Serial.println("$@"+String(osw)+","+String(wl)+","+String(t)+";");
}
}
void obrabotka(){
String str = "";
str = priem.substring(priem.indexOf("$")+1, priem.indexOf(";"));
Serial.println("$"+str+"1;");
priem = "";
napr=str.toInt();
switch(napr){
case 0: stoping(); break;
case 4: forward(); break;
case 3: backward(); break;
case 1: right(); break;
case 2: left(); break;}
}
void loop() {
while(Serial.available()>0){
char pr=Serial.read();
priem+=pr;
}
if(Serial.available()==0){
if(priem.indexOf(";")>-1){obrabotka();}}
timerOpros();
}
Программа для пульта:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4);
char napr;
int conn_del=0;
int reconn=0;
bool conn = 0;
bool peredacha = 1;
bool displayFlag=0;
int ping=0;
int schet=0;
int osw=0;
int wl=0;
int t=0;
int schet2=0;
void setup() {
Serial3.begin(9600);
Serial.begin(9600);
randomSeed(A0);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("hello"));
display.display();
delay(1000);
}
long stv = 0;
void timer() {
if (millis() - stv >= 10) {
stv = millis();
if(!peredacha){conn_del++; schet++;}
schet2++;
if(schet2>=10){
if (peredacha) {
conn_del=0; schet=0; getNapr();
Serial3.println("$" + String(napr) + ";"); peredacha=0;
}
schet2=0;}
if(conn_del>=200 &&!peredacha){conn_del=0; reconn++; Serial3.println("$"+String(napr)+";");}
if(reconn>=6){conn=0; reconn=0; displayFlag=1;}
}
}
int la=0;
void getNapr() {
int jx=analogRead(A1), jy = analogRead(A0);
if (jx > 100 && jx < 900 && jy < 900 && jy > 100) {
napr='0';
}
if (jx > 900 && jy < 900 && jy > 100) {
napr='1';
}
if (jx < 100 && jy < 900 && jy > 100) {
napr='2';
}
if (jy > 900 && jx < 900 && jx > 100) {
napr='3';
}
if (jy < 100 && jx < 900 && jx > 100) {
napr='4';
}
}
void obrabotka(String str) {
str = str.substring(str.indexOf("$") + 1, str.indexOf(";"));
if (str[0] == napr && str[1]=='1') {
ping=schet*10; schet=0;
conn = 1; peredacha=1; reconn=0;
}
if (str[0]=='@'){reconn=0; conn=1; str=str.substring(1);
osw=(str.substring(0,str.indexOf(","))).toInt();
str=str.substring(str.indexOf(",")+1);
wl=(str.substring(0,str.indexOf(","))).toInt();
str=str.substring(str.indexOf(",")+1);
t=str.toInt();
displayFlag=1;
}
str="";
}
void loop() {
static String priem="";
while (Serial3.available() > 0) {
char pr = Serial3.read();
priem += pr;
}
if(Serial3.available()==0){
if (priem.indexOf(";") > -1) {
Serial.println(priem);
obrabotka(priem); priem="";
}
}
timer();
if(displayFlag){
displayFlag=0;
display.clearDisplay();
display.setCursor(0,0);
if(conn){display.print(F("bot connected"));}
else{display.print(F("no connect"));}
display.setCursor(0,14);
display.print("wl: "+String(wl)+" %");
display.setCursor(0,25);
display.print("osw: "+String(osw)+" %");
display.setCursor(0,36);
display.print("temp: "+String(t)+" *C");
display.setCursor(0,47);
display.print("ping: "+String(ping)+" ms");
display.setCursor(100,0);
if(napr=='1'){display.print(F("L")); }
if(napr=='2'){display.print(F("R")); }
if(napr=='3'){display.print(F("N")); }
if(napr=='4'){display.print(F("V")); }
if(napr=='0'){display.print(F("S")); }
display.display();
}
}