Se afișează postările cu eticheta 1602. Afișați toate postările
Se afișează postările cu eticheta 1602. Afișați toate postările

marți, 30 octombrie 2018

Ceas RTC cu reglaj si termometru in 2 zone

   Pentru un ceas cu reglaj si afisare temperaturi pentru 2 zone, una fiind temperatura unei camere (rezolutie mare) si una pentru temperatura tur incalzire centrala (rezolutie redusa), am folosit informatiile din articolul Arduino Digital Clock & Thermometer.
   Schema mea este
   Testele au fost facute de Bogdan Argatu, dupa cum se vede in filmuletul clock with 2 thermometers
 si s-a folosit sketch-ul clock_2ds18b20.ino.
    Alte poze de la montajul realizat de Bogdan:

miercuri, 16 aprilie 2014

Indicator date mediu pentru masina (3)

   Dupa o mica pauza, am reluat partea cu indicatorul de date mediu pentru masina:
- temperatura exterioara, masura cu un senzor DS18B20
- temperatura si umiditate interior masina, masurate cu senzorul DHT11
- tensiunea de pe baterie (acumulator), prin intermediul unui divizor rezistiv.
   Partea descriptiva am prezentat-o in articolul Indicator date mediu pentru masina, iar partea cu teste cu Arduino in articolul Indicator date mediu pentru masina (2), dar ideea a fost sa pun pe masina un montaj independent, asa ca am desenat cu ajutorul programului Eagle PCB Software o schema, dupa care am desenat si cablajul.
   Cablajul a fost realizat de Cristi din Satu Mare, prin metoda transferului de tonner de la o imprimanta laser.
   Am dat gauri in cablaj si m-am apucat de plantat si lipit piesele:
   Dupa ce am pus minimul de piese necesare, am conectat interfata USB si am alimentat si incarcat sketch-ul:
   Neavand intrarile conectate, apar mesaje ciudate la tensiune si temperaturi, dar e bine din punct de vedere al functionarii, dupa cum vedeti si in filmuletul indicator mediu - masina (II)
   A urmat trecelea la alimentarea dintr-o sursa stabilizata reglabila cu tensiunea de 14,5V (valoarea maxima de pe masina) si am lasat vreo 8 ore si nu s-a incalzit regulatorul de tensiune de tip 7805, iar prezentarea experimentului este in filmuletul indicator mediu - masina (III)
   Alimentatorul reglabil folosit de mine a fost prezentat in articolul LM317 si este realizat dupa o schema publicata in Almanahul Tehnium din 1990, iar despre partea de stabilizare de 5V folosita pe placa puteti citi in articolul 78xx.
   Sketch-ul trebuie modificat un pic fata de cel prezentat in articolul Indicator date mediu pentru masina (2) deoarece sunt folositi alti pini pentru afisaj:
// http://nicuflorica.blogspot.ro/2014/04/indicator-date-mediu-pentru-masina-3.html
// original sketch by niq_ro
#include <LiquidCrystal.h>
// folosesc libraria pentru afisaje LCD simple
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// indic modul de legare, vezi mai jos:
/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 8      |  E    |   D8    |
 LCD D4 pin to digital pin 9          |  D4   |   D9    |
 LCD D5 pin to digital pin 10         |  D5   |   D10   |
 LCD D6 pin to digital pin 11         |  D6   |   D11   |
 LCD D7 pin to digital pin 12         |  D7   |   D12   |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/
// http://arduino.cc/en/Reference/LiquidCrystalCreateChar

byte grad[8] = {
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
};

// variables 

float R1, R2, R3; // rezsistors in voltage divisor
float k1; // adjustment for divisor
float u1, u11, u12; // for voltage

int ti; // temperature inside of car;

// data
int VPin = A0; // voltage pin
int DHTPin = A1; // data pin from DHT11
//int DSPin = A2; // 

// for DHT11 sensor
#include "DHT.h"
#define DHTPIN A1     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);



#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 10 on the Arduino
#define ONE_WIRE_BUS A2
#define TEMPERATURE_PRECISION 9
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress outsideThermometer;


void setup() {

R1 = 4.7; // R1 = 4k7
R2 = 10;  // R2 = 10k
R3 = 4.7; // R3 = 4k7
k1 = 1/1.033;


  lcd.createChar(0, grad);
    
  lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 
// initialing the DHT11 sensor;
dht.begin();

 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("indicator bord"); // print a text
 lcd.setCursor(2, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("1.0 by niq_ro"); // print a text
 delay (2000);
 lcd.clear(); // clear the screen
 
// Start up the DS18B20 sensor
  sensors.begin();
// adress for ds sensor  
//   DeviceAddress outsideThermometer  = { 0x28, 0xAC, 0x7A, 0xD4, 0x04, 0x00, 0x00, 0x7E };
//  DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };
// set the resolution to 9..12 bit
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);


} // END void setup




  
void loop(){
  
u1 = analogRead(VPin);
u11 = k1*5.0*u1/1023*(R1+R2+R3)/R1;
u12 = u11 + 0.05;
//u12=11.4; // for test
// u12=7.5;  //for test;

if (u12<10.0)
{
  lcd.setCursor(12, 0);
  lcd.print(u12,1);
  lcd.print("V");
  delay(500);
  lcd.setCursor(12, 0);
  lcd.print("    ");
  }  
else
{
  lcd.setCursor(11, 0);
  lcd.print(u12,1);
  lcd.print("V");
  delay(500);
}

// DHT11 part
 int h = dht.readHumidity();
 int ti = dht.readTemperature();

  lcd.setCursor(0, 1);
  lcd.print("int:");
//ti=0; // for test;
//ti=7;  // for test;
//ti=29;  // for test;
  if (ti<1) {
  lcd.setCursor(5, 1);
  lcd.print(" 0");
  lcd.write(byte(0));
  lcd.print("C");
  delay(500);
  lcd.setCursor(5, 1);
  lcd.print("     ");
  }
  else
  if (ti>=9) {
  lcd.setCursor(4, 1);
  lcd.print("+");
  lcd.print(ti);
  lcd.write(byte(0));
  lcd.print("C");
  }
  else
  //if (ti>=1 || ti<10)
  {
  lcd.setCursor(5, 1);
  lcd.print("+");
  lcd.print(ti);
  lcd.write(byte(0));
  lcd.print("C");
  }

  lcd.setCursor(11, 1);
  lcd.print(h);
  lcd.print("%um");

// 
 DeviceAddress outsideThermometer = { 0x28, 0xAC, 0x7A, 0xD4, 0x4, 0x0, 0x0, 0x7E };
 sensors.requestTemperatures();
 float te = sensors.getTempC(outsideThermometer);
// printTemperature(DeviceAddress outsideThermometer);
 delay(300);
//te=-24;
//te=-2;
//te=-0.4;
// te=0;
//te=0.3;
//te=5;
//te=17;
//te=17.6;


lcd.setCursor(0, 0);
lcd.print("ext:");


if (te<-10) {
 lcd.setCursor(4, 0);
 lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}
else
if (te>-10 || te<0) {
  lcd.setCursor(5, 0);
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}

else
if (te=0) {
lcd.setCursor(5, 0);
lcd.print("=0");
lcd.write(byte(0));
lcd.print("C   ");
}

if (te>0) 
{
lcd.setCursor(5, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}

if (te>=10) {
lcd.setCursor(4, 0);
lcd.print("+");
lcd.print(te,0);
lcd.write(byte(0));
lcd.print("C   ");
}
}   
   Am pus si rezistentele si senzorii si, am costatat ca noul senzor DHT11 consuma peste 1A, undeva la 1,2A.. si se incinge rau LM7805... l-am deconectat si am pus altu' si acum e ok... consumul montajului este de aproximativ 30mA..
 
   Ce am testat arata ca in filmuletul indicator mediu - masina (IV)
   La un consum exagerat (peste 1A) nu au avut nicio sansa stabilizatoarele de tensiune de pe placile Arduino la testele anterioare... 

miercuri, 22 ianuarie 2014

Variator de tensiune pentru bec cu Arduino (V)

   Am revenit la partea de variator de tensiune pentru bec cu incandescenta,pana nu dispar de tot de pe piata... de data asta am pus si un afisaj LCD alfanumeric 1602 (16 coloane si 2 randuri), 2 butoane fara retinere pentru creste si scadere intensitate luminoasa si 16 trepte ...
   Partea cea mai complicata si cea mai periculoasa, care detecteaza trecerea prin zero a tensiunii retelei si, care comanda triacul, se gaseste in articolul Variator de tensiune pentru bec folosind un Arduino:
   In articolele Variator de tensiune pentru un bec cu Arduino (II)Variator de tensiune pentru bec cu Arduino (III) si Variator de tensiune pentru bec cu Arduino (IV) am prezentat mai multe experimente, iar schema de baza ar fi ca cea de mai jos, fara LED-ul RGB:
   Eu am conectat si afisajul LCD la pinii 8..13 obtinand:
- bec stins (0%):
- treapta 1 (6%):
- treapta 2-a (13%):
- treapta 3-a (19%):
- treapta 4-a (25%):
- treapta 5-a (31%):
- treapta 6-a (38%):
- treapta 7-a (44%):
- treapta 8-a (50%):
- treapta 9-a (57%):
- treapta 10-a (63%):
- treapta 11-a (69%):
- treapta 12-a (75%):
- treapta 13-a (82%):
- treapta 14-a (88%):
- treapta 15-a (94%):
- treapta 16-a (100%), adica maxim:
   Si sa "raman in continuare om serios" va arat si programiorul folosit / sketch-ul):
/*
AC Light Control
 Updated by Robert Twomey <rtwomey@u.washington.edu>
 Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445 
 and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
 adapted sketch by niq_ro from
 http://www.tehnic.go.ro 
 http://www.niqro.3x.ro 
 http://nicuflorica.blogspot.com 
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/

#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m3 (22.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

 
void setup() {  // Begin setup
  Serial.begin(9600);   
  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

void zero_cross_detect() {    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}                                 

// Turn on the TRIAC at the appropriate time
void dim_check() {                   
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH);  // turn on light       
      i=0;  // reset time step counter                         
      zero_cross=false;    // reset zero cross detection
    } 
    else {
      i++;  // increment time step counter                     
    }                                
  }    
}                                      

void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
  
 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=127;
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=1;
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    
           

  dim2 = 255-2*dim;
  if (dim2<0)
  {
    dim2 = 0;
  }

  Serial.print("dim=");
  Serial.print(dim);

  Serial.print("     dim2=");
  Serial.print(dim2);
  Serial.print("     dim1=");
  Serial.print(2*dim);
  Serial.print('\n');
  delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100-100*(255-dim2)/255);
 lcd.print("%    "); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("dim. level="); // print a text
 lcd.print(dim);
 lcd.print("  "); // print a text
}
   Am facut si 2 filmulete:
ac light dimmer with Arduino (XVII)
ac light dimmer with Arduino (XVIII)
23.01.2014
   Deoarece am constatat ca la tastarea pentru cresterea sau scaderea intensitatii luminoase, mai apar erori la numarul minim sau maxim, am corectat sketch-ul in 2 locuri:
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
   respectiv:
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }

24.01.2014
   Am desenat si schema de comectare completa:

marți, 21 ianuarie 2014

O fotorezistenta si Arduino (II)

   Fata de articolul precedent, in care am afisat datele pe ecranul de monitorizare seriala, acum o sa afisez pe un LCD1602 (afisaj alfanumeric cu 16 coloane si 2 randuri).
   Deoarece, in ultima perioada, am conectat afisajul doar la pinii D2..D7, o sa mut comanda releului de la D7 la D9, cel de-al doilea ramanand pe D8.
   Schema de conectare devine:
   Un sketch, netestat inca, ar fi de genul:
/* Photocell simple testing sketch. 
Connect one end of the photocell to 5V, the other end to Analog 0.
Then connect one end of a 10K resistor from Analog 0 to ground
For more information see http://learn.adafruit.com/photocells 
niq_ro adapted software program in 20.01.2014, see http://nicuflorica.blogspot.com/
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(2,3,4,5,6,7);
/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 6      |  E    |   D6    |
 LCD D4 pin to digital pin 5          |  D4   |   D5    |
 LCD D5 pin to digital pin 4          |  D5   |   D4    |
 LCD D6 pin to digital pin 3          |  D6   |   D3    |
 LCD D7 pin to digital pin 2          |  D7   |   D2    |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/

int photocellPin = 0;     // the cell and 10K pulldown are connected to a0
int photocellReading;     // the analog reading from the analog resistor divider
 
int relayPin = 9;         // first relay control
int relayPin2 = 8;        // second relay control
 
void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600); 
  pinMode(relayPin, OUTPUT);  // pin "relayPin" is output pin
  pinMode(relayPin2, OUTPUT);  // pin "relayPin" is output pin

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(0, 0); // put cursor at colon 0 and row 0
 lcd.print("Fotorezistenta"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("comanda 2 relee"); // print a text
 delay (2000);
 lcd.clear(); // clear the screen

 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 1 and row 0
 lcd.print("Photoresistor"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("control 2 relay"); // print a text
 delay (2000);

 }
 
void loop(void) {
  digitalWrite(relayPin, HIGH);  // first auxiliar light is off
  digitalWrite(relayPin2, HIGH);  // second auxiliar light is off
  photocellReading = analogRead(photocellPin);  
 
 lcd.clear(); // clear the screen
 if (photocellReading >999) 
 {
lcd.setCursor(0, 0); // put cursor at colon 0 and row 0
 }
 else if (photocellReading >99) 
 {
lcd.setCursor(1, 0); // put cursor at colon 1 and row 0
 }
 else if (photocellReading >9) 
 {
lcd.setCursor(2, 0); // put cursor at colon 2 and row 0
 }
 else
{
lcd.setCursor(3, 0); // put cursor at colon 3 and row 0
 }
 lcd.print(photocellReading); // print a text
 lcd.print(" lx");
  
  Serial.print(photocellReading);     // the raw analog reading
  Serial.print(" lux"); 
  // We'll have a few threshholds, qualitatively determined
  if (photocellReading < 20) {
    Serial.println(" - Dark (intuneric)"); 
    digitalWrite(relayPin, LOW);  // first auxiliar light is on
    digitalWrite(relayPin2, LOW);  // second auxiliar light is on
    Serial.println("All lights are on (Toate luminile sunt aprinse).");
    Serial.println("***********************************************");
  lcd.print(" - Dark");
  lcd.setCursor(2, 1); // put cursor at colon 0 and row 1
  lcd.print("Lights are on");

  } else if (photocellReading < 200) {
    Serial.println(" - Dim (intunecat)");
    digitalWrite(relayPin, LOW);  // first auxiliar light is on
    digitalWrite(relayPin2, HIGH);  // second auxiliar light is off
    Serial.println("First light are on (Un circuit de lumina e aprins).");
    Serial.println("***********************************************");
  lcd.print(" - Dim");
  lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
  lcd.print("1st light are on");

  } else if (photocellReading < 500) {
    Serial.println(" - Light (lumina normala)");
    digitalWrite(relayPin, HIGH);  // first auxiliar light is off
    digitalWrite(relayPin2, HIGH);  // second auxiliar light is off
    Serial.println("All lights are off (Toate luminile sunt stinse).");
    Serial.println("***********************************************");
  lcd.print(" - Light");
  lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
  lcd.print("All lights off!");

  } else if (photocellReading < 800) {
    Serial.println(" - Bright (lumina buna)");
    digitalWrite(relayPin, HIGH);  // first auxiliar light is off
    digitalWrite(relayPin2, HIGH);  // second auxiliar light is off
    Serial.println("All lights are off (Toate luminile sunt stinse).");
    Serial.println("***********************************************");
  lcd.print(" - Bright");
  lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
  lcd.print("All lights off!");

  } else {
    Serial.println(" - Very bright (lumina puternica)");
    digitalWrite(relayPin, HIGH);  // first auxiliar light is off
    digitalWrite(relayPin2, HIGH);  // second auxiliar light is off
    Serial.println("All lights are off (Toate luminile sunt stinse).");
    Serial.println("***********************************************");
  lcd.print("-Dazzling");
  lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
  lcd.print("All lights off!");
  }
  delay(1500);
}
   Am reusit sa fac si o poza:
  Dupa mai multe incercari,am reusit sa fac poze cu cele 4 cazuri:
- lumina orbitoare (soare puternic):
- lumina normala:
- lumina slabuta, s-a aprins un set de lumini, pentru compensare:
- intuneric, s-au aprins ambele circuite de lumini, pentru a compensa lipsa lumnii naturale:
   Filmuletul teste cu fotorezistenta, 2 relee si Arduino (II) realizat cu un aparat photo FujiFilm S5700 este de o calitate slabuta, datorita luminii foarte slabe din camera, dar care ajuta la intelegerea modului de comportare al montajului. 
   Un alt filmulet,numit teste cu fotorezistenta, 2 relee si Arduino (III), a fost facut cu o camera video Praktica DVC 10.1 HDMI: