Panou solar rotativ

Introducere

Prezentarea pe scurt a proiectului vostru:

  • ce face
  • care este scopul lui
  • care a fost ideea de la care aţi pornit
  • de ce credeţi că este util pentru alţii şi pentru voi

Proiectul reprezinta o macheta a unui panou solar ce se afla pe un suport rotativ. Scopul acestuia este sa se invarta dupa sursa de lumina maximizand, astfel, “energia generata”. Informatii referitoare la energie vor fi afisate pe un ecran LCD. Disclaimer: Orice inginer de control va fi cel putin dezgustat de rezultatele proiectului meu

Descriere generală

O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează.

Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html

Voi folosi un mircocontroller Arduino UNO R3 la care va fi legat senzorul de lumina pe I2C. Acesta fiind un senzor analog cu ceva precizie, cel putin asa se lauda ei, ar trebui sa fie capabil sa diferentieze intesitatea luminii pe masura ce aceasta isi schimba pozitia. Folosindu-ne de acest input, va fi comandat un stepper, prin intermediul unui driver bineinteles, acesta fiind unul chinezesc. Informatii referitoare la energia generata de panou vor fi afisate pe un ecran LCD chinezesc, ce va fi legat pe uart.

Hardware Design

  • Arduino Uno R3 (o copie ieftina de la ELEGOO, ce aveam si eu aruncat prin casa, daca se doveste proasta nu voi ezita sa ii dau foc si sa iau alta)
  • LCD QAPASS 1602A (tot asa, aveam aruncat prin casa)
  • Stepper 28BYJ-48 (l-am mai folosit dupa totoriale de pe youtube, datasheet-ul ,daca exista, overrated)
  • Driver de la chinezi (legit scrie in chineza pe el, tot asa, relicva dezgrobata de prin casa)
  • Breadboard, posibil sa fie nevoie

Schema electrica, facut in ltspice si paint, nu sunt barbar sa o desenez:

In schema am folosit VDD si VSS in loc de 5V, respectiv GND pentru ca pentru “GND” nu-mi dadea ltspice-ul label, ci-mi dadea semnul de ground

Detalii pini:

  • SCL, SDA - pentru comunicarea cu i2c cu senzorul de lumina
  • 2 - Register Select al LCD-ului
  • 3 - Enable LCD
  • n - DBn LCD, n = {4, 5, 6, 7}
  • 8, 9, 10, 11 - driverul motor-ului

Io-te, merge:

P.S. Nu se vede pe POZA, dar merge si motorul, doar senzorul nu l-am testat efectiv, adica, cum ar, veni, am facut si in plus (:

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare: Arduino
  • librării şi surse 3rd-party: Stepper.h,, LiquidCrystal.h, TimerOne1.h, Adafruit_VEML7700.h: https://github.com/adafruit/Adafruit_VEML7700
  • Se misca panoul stanga, dreapta pana gaseste o sursa de lumina de minim 700lux

Rezultate Obţinute

  Panoul, desi haotic ish, reuseste sa gaseasca mereu blitz-ul telefonului si sa fie centrat pe el.

Demo: https://youtu.be/LmnLLlTDUFg

Concluzii

Desi arata horror, macar face cat de cat ce trebuie. Ar putea fi folosit efectiv in practica? NU! Se misca mult prea haotic pentru ceva ce ar cantarii sute de kg, dar pt 20g ale mele, functioneaza macar…

codul: Declararea componentelor, global de ce ma-ntrebi:

int stepsPerRevolution = 2048;
int motSpeed = 10;
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Adafruit_VEML7700 veml;

Partea de begin, practic initializarea a ceea ce voi folosi:

Serial.begin(9600);
  myStepper.setSpeed(motSpeed);
  lcd.begin(16,2);
  if (veml.begin()) {
    Serial.println("Found a VEML7700 sensor");
  } else {
    Serial.println("No sensor found ... check your wiring?");
    while (1);
  }
  veml.setGain(VEML7700_GAIN_1);
  veml.setIntegrationTime(VEML7700_IT_100MS);
  Timer1.initialize(10000000);  
  Timer1.attachInterrupt(checkADC);    

Partea de loop:

void loop() {
  int code = look_for_better_sunlight();
  if(code == 10000) {
    lcd.clear();
    int lux = veml.readLux();
    while(lux > 700) {
      lux = veml.readLux();
      float W = 220.0 * lux / 700;
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Lux: " + String(lux) + " KW: " + String(W));
      lcd.setCursor(0,1);
      lcd.print("Sunlight is good");
    }
  }
}

Functia care efectiv imi gaseste lumina:

int look_for_better_sunlight() {
  int lux = veml.readLux();
  float W = 220.0 * lux / 700;
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Bad sunlight");
  lcd.setCursor(0,1);
  lcd.print("Lux: " + String(lux) + " KW: " + String(W));
  int current_steps = 0;
  while (lux < 700) {
    current_steps = 0;
    while(current_steps < stepsPerRevolution/2) {
      int lux_ant = lux;
      myStepper.step(stepsPerRevolution/64);
      current_steps += stepsPerRevolution/64;
      lux = veml.readLux();
      float W = 220.0 * lux / 700;
      lcd.setCursor(0,1);
      lcd.print("Lux: " + String(lux) + " KW: " + String(W));
      if (lux > 700) {
        Serial.println("boss1");
        return 10000;
      }
      if(lux < lux_ant) {
        break;
      }
      delay(100);
    }
    while (current_steps > -stepsPerRevolution/2) {
      int lux_ant = lux;
      myStepper.step(-stepsPerRevolution/64);
      current_steps -= stepsPerRevolution/64;
      lux = veml.readLux();
      float W = 220.0 * lux / 700;
      lcd.setCursor(0,1);
      lcd.print("Lux: " + String(lux) + " KW: " + String(W));
      if (lux > 700) {
        Serial.println("boss2");
        return 10000;
      }
      if (lux < lux_ant) {
        break;
      }
      delay(100);
    }
  }
}

Intreruperea ce genereaza un timer de 10 secunde, ce afiseaza pe LCD “ora noua”, in sensul ca dupa mintea lui a trecut o ora(daca l-as lasa chiar o ora n-as mai avea ce arata la demo)

void checkADC() {
  customInterrupt();
}

void customInterrupt() {
  lcd.setCursor(0,0);
  lcd.print("Ora noua?");
  delay(1000);
}

Download

Jurnal

In toate zilele inafara de azi am facut tema la IA. De m-as putea intoarce in timp as schimba nenorocirea aia de materie cu orice altceva, materia e draguta dar nivelul de munca e la alt nivel…

Bibliografie/Resurse

pm/prj2024/avaduva/atoader.txt · Last modified: 2024/05/26 23:51 by atoader
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0