Semafor + ora, data, temperatura
Last Updated: Feb 02 2018 23:05, Started by
Razvan125
, Feb 02 2018 15:43
·
0
#1
Posted 02 February 2018 - 15:43
Buna ziua.
Am facut un proiect in Arduino Uno cu un semafor iar pe un lcd sa se afiseze ora, data si temperatura. Cum pot face ca sa mearga simultan semaforul si lcdul ? #include <DS3231.h> #include <Wire.h> #include <dht.h> #include <LiquidCrystal_I2C.h> // includes the LiquidCrystal Library #include <Servo.h> DS3231 rtc(SDA, SCL); unsigned long previousMillis = 0; const long interval = 1000; int ledState = LOW; #define BACKLIGHT_PIN 13 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); // 0x27 is the I2C bus address for an unmodified backpack Servo servo; int angle; dht DHT; #define dht_apin A0 void setup() { rtc.begin(); // Initialize the rtc object pinMode(8, OUTPUT); //rosu pinMode(9, OUTPUT); //galben pinMode(10, OUTPUT); //verde //rtc.setDOW(JOI); //rtc.setTime(20,14,00); //rtc.setDate(01,02,2018); lcd.begin(16,2); lcd.setBacklightPin(3, POSITIVE); //aprindem lumina de fundal lcd.setBacklight ( HIGH ); // lumina de fundal on lcd.print("Buna ziua"); lcd.setCursor(8,1); lcd.print("Razvan!"); delay(1000); lcd.clear(); pinMode(LED_BUILTIN, OUTPUT); //luminare led Arduino } void loop() { timp(); semafor(); temp(); semafor(); data(); semafor(); } void timp(void) { lcd.home (); // set cursor to 0,0 lcd.setCursor (0, 0); // go to start of 1st line delay(100); lcd.setBacklight( LOW ); // Backlight off lcd.setBacklight( HIGH ); // Backlight on lcd.print("Ora: "); lcd.print(rtc.getTimeStr()); lcd.setCursor(11,0 ); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Ziua: "); lcd.print(rtc.getDOWStr()); lcd.setCursor(15,1); //elimina "7" de la data (an) lcd.print(" "); lcd.setCursor(14,1); //elimina "7" de la data (an) lcd.print(" "); delay (10000); } void temp(void) { lcd.clear(); DHT.read11(dht_apin); lcd.setCursor (0,0); lcd.print("Temp: "); lcd.print(DHT.temperature); lcd.print(" C"); delay(10000); lcd.clear(); lcd.print("Data: "); lcd.print(rtc.getDateStr()); delay(5000); } void data(void) { lcd.print("Data: "); lcd.print(rtc.getDateStr()); delay(5000); } void semafor(void) { digitalWrite(10,HIGH); // verde delay(5000); digitalWrite(10,LOW); delay(0); digitalWrite(9,HIGH); //galben delay(800); digitalWrite(9,LOW); delay(00); digitalWrite(8,HIGH); //rosu delay(9000); digitalWrite(8,LOW); delay(00); digitalWrite(9,HIGH); //galben delay(800); digitalWrite(9,LOW); delay(00); } } Cum as putea sa rezolv problema ? Edited by Razvan125, 02 February 2018 - 15:45. |
#2
Posted 02 February 2018 - 16:25
Ai nevoie de pini separati pentru semafor si pentru LCD, iar codul trebuie sa poata sa ruleze si seamforul si programul pt lcd in acelasi timp, nu secvential. Cel mai ine ar fi 2 proiecte seaprate pe care le rulezi in acelasi timp, dar nu stiu daca se poate face asta pe Arduino.
|
#3
Posted 02 February 2018 - 16:43
OK,
Daca am inteles problema ta, ar fi faptul ca ai acele delay care te impiedica sa treci mai departe: ai avea 2 variante: 1. Interrupts si setezi 2 ISR in functie de un timer https://www.allabout...pts-on-arduino/ 2 Multi threading https://create.ardui...tutorial-dd2c37 Acum depinde de tine care sa o folosesti, ideea ar fi ca intre threaduri trb sa sti si mod de functionare si transmitere eventuri ca sa ai o succesiune anume, iar la interrupts cateva globale si esti rezolvat Daca nu esti familiarizat ca OS end "chestii" mergi pe interrupts |
#4
Posted 02 February 2018 - 17:06
Al3xandru35, on 02 februarie 2018 - 16:25, said:
Ai nevoie de pini separati pentru semafor si pentru LCD, iar codul trebuie sa poata sa ruleze si seamforul si programul pt lcd in acelasi timp, nu secvential. Cel mai ine ar fi 2 proiecte seaprate pe care le rulezi in acelasi timp, dar nu stiu daca se poate face asta pe Arduino. SorynMG, on 02 februarie 2018 - 16:43, said:
OK, Daca am inteles problema ta, ar fi faptul ca ai acele delay care te impiedica sa treci mai departe: ai avea 2 variante: 1. Interrupts si setezi 2 ISR in functie de un timer https://www.allabout...pts-on-arduino/ 2 Multi threading https://create.ardui...tutorial-dd2c37 Daca nu esti familiarizat ca OS end "chestii" mergi pe interrupts |
#5
Posted 02 February 2018 - 17:51
#include <DS3231.h> #include <Wire.h> #include <dht.h> #include <LiquidCrystal_I2C.h> #include <Servo.h> DS3231 rtc(SDA, SCL); int ledState = LOW; int carRed = 12; // rosu int carYellow = 11; //galben int carGreen = 10; // verde int button = 2; //button pin int pieRed = 8; //rosu pietoni int pieGreen = 9; //verde pietoni int crossTime =5000; unsigned long changeTime; #define BACKLIGHT_PIN 13 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7); Servo servo; int angle; dht DHT; #define dht_apin A0 void setup() { rtc.begin(); pinMode(carRed, OUTPUT); pinMode(carYellow, OUTPUT); pinMode(carGreen, OUTPUT); pinMode(pieRed, OUTPUT); pinMode(pieGreen, OUTPUT); pinMode(button, INPUT); //rtc.setDOW(JOI); //rtc.setTime(17,36,00); //rtc.setDate(01,02,2018); lcd.begin(16,2); lcd.setBacklightPin(3, POSITIVE); //aprindem lumina de fundal lcd.setBacklight ( HIGH ); // lumina de fundal on lcd.print("Buna ziua"); lcd.setCursor(8,1); lcd.print("Razvan!"); delay(1000); lcd.clear(); digitalWrite(carGreen, HIGH); //porneste culoare verde masini digitalWrite(pieRed, HIGH); //porneste culoare rosie de la pietoni pinMode(LED_BUILTIN, OUTPUT); //luminare led Arduino } void loop() { timp(); data(); temp(); int state = digitalRead(button); if(state == HIGH && (millis() - changeTime)> 5000) // daca au trecut 5 secunde de la ultima apasare, se aprinde verde la pietoni { changeLights(); } } void timp(void) { lcd.home (); // set cursor to 0,0 lcd.setCursor (0, 0); // go to start of 1st line delay(100); lcd.setBacklight( LOW ); // Backlight off lcd.setBacklight( HIGH ); // Backlight on lcd.print("Ora: "); lcd.print(rtc.getTimeStr()); lcd.setCursor(11,0 ); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Ziua: "); lcd.print(rtc.getDOWStr()); lcd.setCursor(15,1); //elimina "7" de la data (an) lcd.print(" "); lcd.setCursor(14,1); //elimina "7" de la data (an) lcd.print(" "); delay (10000); } void temp(void) { lcd.clear(); DHT.read11(dht_apin); lcd.setCursor (0,0); lcd.print("Temp: "); lcd.print(DHT.temperature); lcd.print(" C"); delay(10000); lcd.clear(); lcd.print("Data: "); lcd.print(rtc.getDateStr()); delay(5000); } void data(void) { lcd.print("Data: "); lcd.print(rtc.getDateStr()); delay(5000); } void changeLights() { digitalWrite(carGreen, LOW); //green off digitalWrite(carYellow, HIGH); //yellow on delay(2000); //wait 2 seconds digitalWrite(carYellow, LOW); //yellow off digitalWrite(carRed, HIGH); //red on delay(1000); //wait 1 second till its safe digitalWrite(pieRed, LOW); //ped red off digitalWrite(pieGreen, HIGH); //ped green on delay(crossTime); //atentioneaza se schimba in rosu la pietoni for (int x=0; x<10; x++) { digitalWrite(pieGreen, HIGH); delay(250); digitalWrite(pieGreen, LOW); delay(250); } digitalWrite(pieRed, HIGH);//pietoni rosu on delay(500); digitalWrite(carRed, LOW); //rosu off digitalWrite(carYellow, HIGH); //galben on delay(1000); digitalWrite(carYellow, LOW); //galben off digitalWrite(carGreen, HIGH); changeTime = millis(); // memoreaza timpul de la ultima schimbare de semafor //terminare } Am facut asa. 90% functioneaza cum vreau eu. ( am mai adaugat un semafor pentru pietoni pe care il actionez de la un buton ). |
#6
Posted 02 February 2018 - 19:35
#7
Posted 02 February 2018 - 23:05
Mda. Tot nu ma descurc.
Aici am gasit un program interesant. https://github.com/D...LCDTrafficLight Afiseaza pe ecran mesaje in functie de culoare semaforului. "Stai", "Atentie", "Du-te". Trebuie sa incerc maine sa-l modific pe al meu in functie de acesta. Sa-l fac ca atunci cand se schimba culoarea semaforului sa se schimbe si mesajul de pe LCD. Edited by Razvan125, 02 February 2018 - 23:08. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users