Εμφάνιση ενός μόνο μηνύματος
  #327  
Παλιά 04-11-17, 14:23
Το avatar του χρήστη AgMa
AgMa Ο χρήστης AgMa δεν είναι συνδεδεμένος
Senior Member
 
Εγγραφή: 10-11-2014
Περιοχή: Κρήτη, Ηράκλειο
Μηνύματα: 423
Προεπιλογή

Ωραίος! Το stilo ήταν ο εμπνευστής του δημιουργού του iAqua.
Μια παρατήρηση μόνο, αν είδα καλά τροφοδοτείς το arduino με 9v. Όχι ότι είναι κακό, αλλά το καλύτερο θα ήταν 7-7.5v ώστε να μην ζεσταίνεται αρκετά ο regulator για να ρίξει την τάση στα 5v.
Σχετικά με τον κώδικα τώρα, σου ανεβάζω αυτά που χρειάζεσαι για να παίξει. Χρειάζεσαι και ένα BC337 για να μπορέσει να ντιμάρει. Η φωτοαντίσταση απλά ρυθμίζει την τάση που θα πάει στην οθόνη με βάσει το τι διαβάζει σαν εξωτερικό φωτισμό:
Κώδικας:
const int lightSensorPin = A8;  // analog pin for the ambient light sensor
const int screenBrightPin = 8; // pwm pin for the LCD backlight
byte screenDimLevel, screenDimSec, screenBrightMem, screenBrightness;
Και στο void setup() θα βάλεις αυτά:
Κώδικας:
pinMode(screenBrightPin, OUTPUT);
pinMode(lightSensorPin, INPUT);

// get screen settings from eeprom
readScreenSettings();
analogWrite(screenBrightPin, screenBrightness); // turn up screen brightness right away
Στο void loop():
Κώδικας:
// adjust brightness automatically unless touch event
  unsigned long pastSeconds;
  if (screenDimSec != 0) // if set to 0, we won't dim
  {
    if (screenDimLevel != 0) // if set to 0, we won't dim
    {
      if (backlightTouch == true)
      {
        pastSeconds = (currentTime - dimTime);
        if (pastSeconds > screenDimSec) backlightTouch = false;
      }
      else
      {
        autoBrightness();
      }
    }
  }

void autoBrightness()
{
  int photocellReading = analogRead(lightSensorPin); 
  
  // map the photo sensor value of 0-1023 directly to the PWM output of 0-255
  int brightnessLevel=map(photocellReading, 0, 1023, 0, 255);

  // can't get brighter than 255, must be at least 1 or it's off
  brightnessLevel = constrain(brightnessLevel, 5, 255);

  int diff=brightnessLevel-backLight;
  if (diff < 0)
  {
    diff = ((diff - diff) - diff);
  }
  if (diff > 25) // we only adjust brightness if it's more than a 10% change from where we are now
  {
    rampScreenBrightness(backLight, brightnessLevel);
  }
}

// smoothly ramps the screen brightness from one level to another
void rampScreenBrightness(byte fromLevel, byte toLevel)
{
  if (fromLevel < toLevel)
  {
    while (fromLevel < toLevel)
    {
      analogWrite(screenBrightPin, fromLevel);
      fromLevel++;
      Alarm.delay(5);
    }
  }
  else if (fromLevel > toLevel)
  {
    while (fromLevel > toLevel)
    {
      analogWrite(screenBrightPin, fromLevel);
      fromLevel--;
      Alarm.delay(5);
    }
  }
  backLight = toLevel;
}

void readScreenSettings()
{
  screenDimLevel = EEPROM.read(29); //Brightness during idle
  screenBrightMem = EEPROM.read(31);//Brightness during operation
  
  if (screenBrightMem > 10)
  {
    screenBrightMem = 10;
    EEPROM.update(31, 10);
  }
  screenBrightness = screenBrightMem * 25;
}
Ο κώδικας με bold είναι σε περίπτωση που έχεις στο μενού επιλογή να ντιμάρει μετά από συγκεκριμένο χρόνο idle και να μην έχεις απενεργοποιήσει το ντιμάρισμα από το μενού.
Καλό θα ήταν να τα συμπεριλάβεις για να παίξει σωστά, αλλά μετά θα πρέπει να φτιάξεις και τις κατάλληλες επιλογές στο μενού ώστε να ορίσεις εσύ πότε θα είναι το idle.
Αλλιώς δεν ξέρω αν μπορεί να γίνει κατευθείαν από τον κώδικα. Πχ. να διαβάζει σαν default screen settings μια συγκεκριμένη τιμή:

Κώδικας:
screenDimSec = EEPROM.read(30);   //How long to wait for idle
Και να βάλουμε στην EEPROM:

Κώδικας:
EEPROM.update(30, 30);
Και οι θέσεις που έχω εγώ στην EEPROM για την φωτεινότητα:
Κώδικας:
// default screen settings
    EEPROM.update(29, 3);
    EEPROM.update(31, 255);
Σου έχω βάλει συνημμένο το fritzing με την εγκατάσταση.
Συνημμένα Αρχεία
Τύπος Αρχείου: rar Auto brightness.rar (12,8 KB, 223 εμφανίσεις)
Απάντηση με παράθεση
 
Page generated in 0,01646 seconds with 12 queries