kodl69 píše:Takže to nemáš podle toho schématu co uvádíš, ale máš display shield. Je potřeba správně definovat piny u LiquidCrystal lcd(8, 9, 4, 5, 6, 7); a vyzkoušet na základním příkladu co je v ide "hello word" pokud se tohle zobrazí, je to ok. Ještě pozor na trimr konrastu, pro začátek ho nastav aby trochu byly vidět všechny body pořád, možná máš jenom kontrast "mimo rozsah".
No po pravdě, dneska jsem zprovoznoval arduino poprvé. Tak v tom lítám.
Takto je nastavené:
//knihovny
#include <LiquidCrystal.h> // include LCD library
/*--------------------------------------------------------------------------------------
Defines
--------------------------------------------------------------------------------------*/
// Pins in use
#define BUTTON_ADC_PIN A0 // A0 is the button ADC input
// ADC readings expected for the 5 buttons on the ADC input
#define RIGHT_10BIT_ADC 0 // right
#define UP_10BIT_ADC 135 // up
#define DOWN_10BIT_ADC 309 // down
#define LEFT_10BIT_ADC 484 // left
#define SELECT_10BIT_ADC 727 // right
#define BUTTONHYSTERESIS 10 // hysteresis for valid button sensing window
//return values for ReadButtons()
#define BUTTON_NONE 0 //
#define BUTTON_RIGHT 1 //
#define BUTTON_UP 2 //
#define BUTTON_DOWN 3 //
#define BUTTON_LEFT 4 //
#define BUTTON_SELECT 5 //
/*--------------------------------------------------------------------------------------
Variables
--------------------------------------------------------------------------------------*/
byte buttonJustPressed = false; //this will be true after a ReadButtons() call if triggered
byte buttonJustReleased = false; //this will be true after a ReadButtons() call if triggered
byte buttonWas = BUTTON_NONE; //used by ReadButtons() for detection of button events
/*--------------------------------------------------------------------------------------
Init the LCD library with the LCD pins to be used
--------------------------------------------------------------------------------------*/
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 ); //Pins for the freetronics 16x2 LCD shield. LCD: ( RS, E, LCD-D4, LCD-D5, LCD-D6, LCD-D7 )
int analogPin = 3; // pin na kterem merime napeti na baterii
float targetVoltage = 28.8; // hodnota ciloveho napeti
float minVoltage = 28 ; // minimalni hodnota napeti, pri kterem se vypina PWM
float VoltageStep = 0.1;//skok pro zmenu napeti
float analogVoltage = 0; // hodnota na pinu analogPin
int pwmPin = 13; // pin na kterem vyrabime PWM signal
float analogOffset = 18.05;//zacatek rozsahu - posunute zenerkou
float analogRange = 14.1;//mereny rozsah (m)
float diffMax = 0.7; // maximalni odchylka od ciloveho napeti
byte pwmDuty = 0; // kolik % PWM cyklu bude rele zapnuto
byte pwmStepUp = 2; // minimalni zmena skoku PWM nahoru
byte pwmStepDown = 4; // minimalni zmena skoku PWM dolu
int pwmMax = 100; // maximalni povoleny vykon v %
int pwmFreq = 50; // frekvence PWM - maximalne 100Hz!
int pwmCycle = 1; // cas v sekundach mezi zmenou PWM duty
int sumTime = 0; // celkova delka PWM cyklu v ms
int pwmLength = 0; // delka jednoho cyklu v milisekundach
int tempDelay = 5;//kolik cyklu se nevycita teplota (zdrzuje)
int loadPower = 700; // vykon zateze W pro vypocet akumulovane energie ve Wh
float loadTime;//prubezne nacitani casu ON v milisekundach pro zobrazeni Wh
int j;//pomocna promena pro pocitani cyklu
int k; //pro teplotu, neumim zaokrouhleni jinak
// funkce se provede po startu
void setup() {
lcd.begin(16, 2);
//button adc input
pinMode( BUTTON_ADC_PIN, INPUT ); //ensure A0 is an input
digitalWrite( BUTTON_ADC_PIN, LOW ); //ensure pullup is off on A0
// nastaveni digitalniho pinu jako vystup
pinMode(pwmPin, OUTPUT);
}
/*--------------------------------------------------------------------------------------
ReadButtons()
Detect the button pressed and return the value
Uses global values buttonWas, buttonJustPressed, buttonJustReleased.
--------------------------------------------------------------------------------------*/
byte ReadButtons()
{
unsigned int buttonVoltage;
byte button = BUTTON_NONE; // return no button pressed if the below checks don't write to btn
//read the button ADC pin voltage
buttonVoltage = analogRead( BUTTON_ADC_PIN );
//sense if the voltage falls within valid voltage windows
if( buttonVoltage < ( RIGHT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_RIGHT;
}
else if( buttonVoltage >= ( UP_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( UP_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_UP;
}
else if( buttonVoltage >= ( DOWN_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( DOWN_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_DOWN;
}
else if( buttonVoltage >= ( LEFT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( LEFT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_LEFT;
}
else if( buttonVoltage >= ( SELECT_10BIT_ADC - BUTTONHYSTERESIS )
&& buttonVoltage <= ( SELECT_10BIT_ADC + BUTTONHYSTERESIS ) )
{
button = BUTTON_SELECT;
}
//handle button flags for just pressed and just released events
if( ( buttonWas == BUTTON_NONE ) && ( button != BUTTON_NONE ) )
{
//the button was just pressed, set buttonJustPressed, this can optionally be used to trigger a once-off action for a button press event
//it's the duty of the receiver to clear these flags if it wants to detect a new button change event
buttonJustPressed = true;
buttonJustReleased = false;
}
if( ( buttonWas != BUTTON_NONE ) && ( button == BUTTON_NONE ) )
{
buttonJustPressed = false;
buttonJustReleased = true;
}
//save the latest button value, for change event detection next time round
buttonWas = button;
return( button );
}
void loop() {
//zmena ciloveho napeti tlacitky
{
byte button;
byte timestamp;
//get the latest button pressed, also the buttonJustPressed, buttonJustReleased flags
button = ReadButtons();
switch( button )
{case BUTTON_NONE:
{break;}
case BUTTON_RIGHT:
{
minVoltage +=VoltageStep;
break;
}
case BUTTON_LEFT:
{
minVoltage -= VoltageStep;
break;
}
case BUTTON_UP:
{
targetVoltage += VoltageStep;
break;
}
case BUTTON_DOWN:
{
targetVoltage -= VoltageStep;
break;
}
case BUTTON_SELECT:
{
break;
}
}
// nacteme aktualni napeti (poradi clenu dela bordel, asi pocita na malo desetinych mist?)
analogVoltage= (analogRead(analogPin) * analogRange)/1024+analogOffset;
// pokud je rozdil napeti skutecneho a ciloveho
// ve stanovene mezi, zvysime vykon, jinak snizujeme
if (targetVoltage - analogVoltage < diffMax)
{
if (pwmDuty+pwmStepUp > pwmMax)
{
pwmDuty=pwmMax;
}
else
{
pwmDuty=pwmDuty+pwmStepUp;
}
}
else
{
if (pwmDuty-pwmStepDown < 0)
{
pwmDuty=0;
}
else
{
pwmDuty=pwmDuty-pwmStepDown;
}
}
// skokove stazeni vykonu, pokud dojde k poklesu napeti
if ( analogVoltage < minVoltage)
{
pwmDuty=0;
}
lcd.setCursor(0, 0);
lcd.print("Ak");
if(analogVoltage > analogOffset + 0.1){
lcd.print(analogVoltage, 1);
}
else{
lcd.print("--.-");
}
lcd.print("V");
lcd.setCursor(8, 0);
lcd.print("ON:");
lcd.print(targetVoltage, 1);
lcd.print("V");
lcd.setCursor(0, 1);
lcd.print("Pow:");
lcd.print(pwmDuty);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print("Wh:");
//bez pouziti promene typu int a pretypovani primo ve vysledku obcas lezly zaporne hodnoty ??
k = ( loadTime / 1000 * loadPower / 3600);
lcd.setCursor(11, 1);
lcd.print(k);
//loadTime=0;
//cteni teploty jednou za deset cyklu (zdrzuje)
j++;
if(j==tempDelay){
j=0;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print("T1:");
//lcd.setCursor(3, 2);
lcd.print((char)223);
lcd.setCursor(8, 2);
lcd.print("T2:");
//lcd.setCursor(13, 2);
lcd.print((char)223);
lcd.setCursor(8, 0);
lcd.print("OF:");
lcd.print(minVoltage, 1);
lcd.print("V");
}
// Vlastni PWM cyklus
sumTime = 0;
pwmLength = 1000 / pwmFreq;
while ( sumTime < pwmCycle * 1000)
{
if(pwmDuty == 100){
digitalWrite(pwmPin, HIGH);
sumTime=pwmCycle * 1000;
loadTime +=pwmCycle * 1000;
delay(pwmCycle * 1000);
}
else if (pwmDuty > 0)
{
sumTime=sumTime+pwmLength+pwmLength*(100-pwmDuty)/pwmDuty;
digitalWrite(pwmPin, HIGH);
loadTime +=pwmLength;
delay(pwmLength);
digitalWrite(pwmPin, LOW);
delay(pwmLength*(100-pwmDuty)/pwmDuty);
}
else
{
digitalWrite(pwmPin, LOW);
sumTime=pwmCycle * 1000;
delay(pwmCycle * 1000);
}
}
}
}