21-01-2019, 14:34
Witam, jestem początkującym programistą(jeżeli można to tak nazwać). Zacząłem pisać program sygnalizacji świetlnej, która na listwie RGB ma wyświetlać kolory, a na ekranie LCD 16x2 ma wyświetlać komunikaty.
Jeden kod wygląda tak:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800);
LiquidCrystal_I2C lcd(0x27,16,2);
#define guzik 5
void setup() {
pinMode(guzik, INPUT_PULLUP);
linijka.begin();
linijka.show();
lcd.init();
lcd.backlight();
lcd.begin(16,2);
}
void loop() {
czerwone();
delay();
nacisk();
delay();
przerwa();
zielone();
delay();
}
void nacisk(){
if(digitalRead(guzik)==LOW){
lcd.setCursor(0,0);
lcd.print(" Swiatlo zaraz zmieni sie na zielone ");
for (int scrollCounter=0;scrollCounter<23;scrollCounter++)
{
lcd.scrollDisplayLeft();
delay(500);
}
linijka.setPixelColor(3, linijka.Color(255, 255, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(255, 255,0));
linijka.show();
delay(1000);
lcd.clear();
}
}
void zielone(){
lcd.setCursor(0,0);
lcd.print(" Zielone! ");
delay(500);
linijka.setPixelColor(2, linijka.Color(0, 255, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 255,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 255,0));
linijka.show();
delay(4000);
}
void czerwone(){
lcd.setCursor(0,0);
lcd.print(" Czerwone! ");
delay(500);
linijka.setPixelColor(5, linijka.Color(255, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(255, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(255, 0,0));
linijka.show();
delay(4000);
}
void przerwa(){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
}
Jednakże nie potrafię obsługiwać się dobrze funkcjami i nie wiem jak włączyć jedną funkcje a następnie drugą.
Drugi kod działa za pierwszym razem czeka 5 sekund na czerwonym potem wyświetla zielone a podczas czekania na czerwonym jeżeli wcisnę guzik to wyświetla się komunikat i żółte światło:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
unsigned long czas = 0;
unsigned long rczas = 0;
unsigned long wczas = 0;
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800);
LiquidCrystal_I2C lcd(0x27,16,2);
#define guzik 5
void setup() {
pinMode(guzik, INPUT_PULLUP);
linijka.begin();
linijka.show();
lcd.init();
lcd.backlight();
lcd.begin(16,2);
}
void loop() {
czas=millis();
rczas=czas-wczas;
lcd.setCursor(0,0);
lcd.print(" Czerwone! ");
delay(500);
linijka.setPixelColor(5, linijka.Color(255, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(255, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(255, 0,0));
linijka.show();
millis();
if(digitalRead(guzik)==LOW){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(2, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 0,0));
linijka.show();
lcd.setCursor(0,0);
lcd.print(" Swiatlo zaraz zmieni sie na zielone ");
for (int scrollCounter=0;scrollCounter<23;scrollCounter++)
{
lcd.scrollDisplayLeft();
delay(500);
}
linijka.setPixelColor(3, linijka.Color(255, 255, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(255, 255,0));
linijka.show();
delay(1000);
lcd.clear();
}
if(rczas>=5000){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
delay(1000);
lcd.setCursor(0,0);
lcd.print(" Zielone! ");
delay(500);
linijka.setPixelColor(2, linijka.Color(0, 255, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 255,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 255,0));
linijka.show();
millis();
}
setup();
}
Prosiłbym o jakieś rady co mogę poprawić, co mogę zastosować. Wierzę, że nie zwyzywacie mnie, tylko pomożecie jako doświadczeni koledzy zielonemu chłopakowi. Z góry dzięki!
Jeden kod wygląda tak:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800);
LiquidCrystal_I2C lcd(0x27,16,2);
#define guzik 5
void setup() {
pinMode(guzik, INPUT_PULLUP);
linijka.begin();
linijka.show();
lcd.init();
lcd.backlight();
lcd.begin(16,2);
}
void loop() {
czerwone();
delay();
nacisk();
delay();
przerwa();
zielone();
delay();
}
void nacisk(){
if(digitalRead(guzik)==LOW){
lcd.setCursor(0,0);
lcd.print(" Swiatlo zaraz zmieni sie na zielone ");
for (int scrollCounter=0;scrollCounter<23;scrollCounter++)
{
lcd.scrollDisplayLeft();
delay(500);
}
linijka.setPixelColor(3, linijka.Color(255, 255, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(255, 255,0));
linijka.show();
delay(1000);
lcd.clear();
}
}
void zielone(){
lcd.setCursor(0,0);
lcd.print(" Zielone! ");
delay(500);
linijka.setPixelColor(2, linijka.Color(0, 255, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 255,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 255,0));
linijka.show();
delay(4000);
}
void czerwone(){
lcd.setCursor(0,0);
lcd.print(" Czerwone! ");
delay(500);
linijka.setPixelColor(5, linijka.Color(255, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(255, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(255, 0,0));
linijka.show();
delay(4000);
}
void przerwa(){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
}
Jednakże nie potrafię obsługiwać się dobrze funkcjami i nie wiem jak włączyć jedną funkcje a następnie drugą.
Drugi kod działa za pierwszym razem czeka 5 sekund na czerwonym potem wyświetla zielone a podczas czekania na czerwonym jeżeli wcisnę guzik to wyświetla się komunikat i żółte światło:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
unsigned long czas = 0;
unsigned long rczas = 0;
unsigned long wczas = 0;
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, 3, NEO_GRB + NEO_KHZ800);
LiquidCrystal_I2C lcd(0x27,16,2);
#define guzik 5
void setup() {
pinMode(guzik, INPUT_PULLUP);
linijka.begin();
linijka.show();
lcd.init();
lcd.backlight();
lcd.begin(16,2);
}
void loop() {
czas=millis();
rczas=czas-wczas;
lcd.setCursor(0,0);
lcd.print(" Czerwone! ");
delay(500);
linijka.setPixelColor(5, linijka.Color(255, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(255, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(255, 0,0));
linijka.show();
millis();
if(digitalRead(guzik)==LOW){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(2, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 0,0));
linijka.show();
lcd.setCursor(0,0);
lcd.print(" Swiatlo zaraz zmieni sie na zielone ");
for (int scrollCounter=0;scrollCounter<23;scrollCounter++)
{
lcd.scrollDisplayLeft();
delay(500);
}
linijka.setPixelColor(3, linijka.Color(255, 255, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(255, 255,0));
linijka.show();
delay(1000);
lcd.clear();
}
if(rczas>=5000){
linijka.setPixelColor(5, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(6, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(7, linijka.Color(0, 0,0));
linijka.show();
linijka.setPixelColor(3, linijka.Color(0, 0, 0));
linijka.show();
linijka.setPixelColor(4, linijka.Color(0, 0,0));
linijka.show();
delay(1000);
lcd.setCursor(0,0);
lcd.print(" Zielone! ");
delay(500);
linijka.setPixelColor(2, linijka.Color(0, 255, 0));
linijka.show();
linijka.setPixelColor(1, linijka.Color(0, 255,0));
linijka.show();
linijka.setPixelColor(0, linijka.Color(0, 255,0));
linijka.show();
millis();
}
setup();
}
Prosiłbym o jakieś rady co mogę poprawić, co mogę zastosować. Wierzę, że nie zwyzywacie mnie, tylko pomożecie jako doświadczeni koledzy zielonemu chłopakowi. Z góry dzięki!