Программная часть системы




Программы созданы в бесплатной среде 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();

}

}

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-07-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: