Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Mezina familiei, Merida BigNine

The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...

Upgrade de la MacBook Pro M1 cu 8...
 Ce tip de monitor am nevoie pt of...

Resoftare camera supraveghere

Laptop Gaming

Cu ce va aparati de cainii agresi...
 Nu imi platiti coletul cu cardul ...

Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone
 Monede JO 2024

Suprasolicitare sistem electric

CIV auto import

Mutare in MOZAMBIC - pareri, expe...
 

Semafor + ora, data, temperatura

- - - - -
  • Please log in to reply
6 replies to this topic

#1
Razvan125

Razvan125

    Active Member

  • Grup: Members
  • Posts: 1,365
  • Înscris: 03.02.2016
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
Al3xandru35

Al3xandru35

    Active Member

  • Grup: Members
  • Posts: 1,325
  • Înscris: 30.09.2011
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
SorynMG

SorynMG

    Junior Member

  • Grup: Junior Members
  • Posts: 49
  • Înscris: 22.11.2017
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
Razvan125

Razvan125

    Active Member

  • Grup: Members
  • Posts: 1,365
  • Înscris: 03.02.2016

 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.
Da, asta am nevoie. Vreau ca semaforul sa mearga in treaba lui ( sa nu aiba nicio legatura cu LCD-ul )

 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
Mda. Inca nu sunt asa bine familiarizat cu Arduino. Multumesc ! Am sa revin cu un update cand am sa rezolv problema.

#5
Razvan125

Razvan125

    Active Member

  • Grup: Members
  • Posts: 1,365
  • Înscris: 03.02.2016
#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
dexterash

dexterash

    --something---

  • Grup: Senior Members
  • Posts: 22,912
  • Înscris: 19.08.2004
Poti incerca si abordarea aceasta:
https://create.ardui...-arduino-ebc3cc

#7
Razvan125

Razvan125

    Active Member

  • Grup: Members
  • Posts: 1,365
  • Înscris: 03.02.2016
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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate