Intr-un vechi articol din 2013, am conectat un afisaj de Nokia 5110 la radio FM facut cu TEA5767 si o placa Arduino Uno, de data asta am folosit un Arduino Mega pentru a putea implementa usor si un reglaj de volum..
Schema folosita este:
Fata de ce am prezentat in vechiul articol, care are urmatoarea prezentare grafica pe ecran:
acum arata asa:
iar modul de functionare este similar, doar ca datele sunt stocate in memoria EEPROM a microcontrolerului de pe placa de dezvoltare (se memoreaza frecventa postului ascultat - sketch: TEA5767_eeprom_i2c_lcdNokia5110_3m1a.ino), dupa cum se vede si in cele 2 filmulete:
In articolul Senzorul ultrasonic de distanta HC-SR04 si Arduino, am afisat datele pe un ecran alfanumeric cu 16 coloane si 2 randuri. De data asta am conectat un ecran de Nokia 5110 pentru a avea si o reprezentare grafica a variatiei distantei masurate. Schema de conectare este:
Primele teste, in care am folosit sketch-ul ultrasonic_5110_ver1m0.ino, imi arata urmatoarele informatii pe ecran:
apoi am modificat sketch-ul, care devine ultrasonic_5110_ver1m2.ino, si am o reprezentare grafica prin puncte:
care nu mi-a placut, asa ca am memorat masurarea anteriar, realizand un grafic cu linii (sketch-ul devine ultrasonic_5110_ver1m3.ino):
Pentru a se intelege mai bine modul de prezentare pe ecran, am facut 2 filmulete:
O statie meteo cu ceas si date meteo prezentate pe un afisaj de Nokia 5110 se gasesc in articolul Afisajul folosit la telefoanele Nokia 5110/3310 si Arduino (III); montajul prezentat acolo are in componenta sa: - o placa compatibila Arduino Uno - un ceas cu DS1307 - temperatura si umiditate cu DHT11 - afisaj de Nokia 5110 (controler PCD8544) iar schema de conectare este:
Acum am schimbat senzorul de temperatura si umiditate cu unul mai bun, DHT22, care este mult mai precis, dupa cum am prezentat si in articolul Ceas RTC cu DS1307 si date mediu cu DHT22 pe afisaj alfanumeric LCD1602 folosind Arduino. Cum am scris si acolo, senzorul DTH22 se vinde ca modul cu 3 pini sau ca piesa cu 4 pini, avand cod AM2302, care necesita o rezistenta de 4k7 intre iesire (OUT/DATAS) si plus (VDD/5V):
Schema de conectare este identica:
Adaptorul de afisaj la care fac referire are schema (fundalul se poate aprinde fie punand conectorul "background" la masa, fie la +5V, depinde de schema de conectare al ledurilor de pe modul)
Sketch-ul este foarte putin modificat, modificare consta in anularea liniei cu DHT11 si introducerea uneia in care este scris DHT22:
Sketch-ul se gaseste pe https://github.com/tehniq3 !! Am facut cateva poze cu montajul si datele de pe afisaj:
In mod normal, in sketch, ceasul de timp real cu DS1307 ia data de la calculator, daca nu este niciuna inscrisa:
iar daca vrem sa reglam ceasul (ora de vara/iarna, etc), activam linia:
incarcam scketch-ul, apoi anulam linia (cum a fost initial) si reincarcam sketch-ul.. PS: Avand in vedere ca senzorul DHT22 ofera informatii mai detalite despre temperatura, am pus si cifra dupa virgula:
sketch-ul versiunea 1.8b se gaseste pe https://github.com/tehniq3. PS2: Am facut si poze cu un aparat de fotografiat:
Fata de articolele anterioare, acum o sa prezint ce grafica interesanta se poate face folosind libraria GFX de la Adafruit pentru afisajele folosite la telefoanele Nokia 5110 sau 3310, care sunt controlate de driverul PCD8544, iar rezolutia grafica este de 84x48 pixeli. Schema de conectare, inclusiv adaptorul de tensiuni e acelasi:
M-am gandit la un secundar de ceas...
iar porecla de pe net (niq_ro) sa fie afisat in partea de jos cand secundarul este in zona de sus, respectiv in partea de sus cand secundarul este in partea de jos:
Pentru a desena ceva, trebuie sa stim ca dimensiunea utila este de 84 de puncte pe orizontala si 48 pe verticala, punctul notat cu (0,0) este in coltul din stanga sus, iar cel cu (83, 47) este in dreapta jos.
In libraria grafica Adafruit_GFX, comanda pentru linie, este:
display.drawLine(x0,y0, x1, y1, BLACK);
(x0,y0) sunt coordonatele punctului de inceput, iar (x1,y1) sunt coordonatele punctului de final al liniei.
Sketch-ul scris de mine, care "face" ce se vede in cele 3 filmulete este urmatorul:
// original sketch by niq_ro, created in 7.aug.2013 at Santanandrei, Hunedoara
// using graphics library (GFX) from Adafruit
/*********************************************************************
This is an example sketch for our Monochrome Nokia 5110 LCD Displays
Pick one up today in the adafruit shop!
------> http://www.adafruit.com/products/338
These displays use SPI to communicate, 4 or 5 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/
#include <Adafruit_GFX.h>
// using library for LCD Nokia 5110/3310 type
#include <Adafruit_PCD8544.h>
// for my Nokia 5110 LCD from China
// see http://nicuflorica.blogspot.ro/2013/06/afisajul-folosit-la-telefoanele-nokia.html
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)
// Adafruit_PCD8544 display = Adafruit_PCD8544(SCLK, DIN, DC, CS, RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);
// center
int x0=84/2;
int y0=48/2;
// radius
int r=23;
// angle
int alfa=0;
void setup() {
Serial.begin(9600);
display.begin();
// init done
// you can change the contrast around to adapt the display
// for the best viewing!
display.setContrast(50);
display.clearDisplay();
// text display tests
display.setTextSize(2);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("tehnic. go.ro");
display.setTextSize(2);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println(" niq_ro ");
display.display();
delay(2000);
display.clearDisplay();
// text display tests
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0,0);
display.println(" Adafruit GFX ");
display.setCursor(15,10);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println(" library ");
display.setCursor(0,20);
display.setTextColor(BLACK); // 'inverted' text
display.println("--------------");
display.setCursor(0,30);
display.setTextColor(BLACK); // 'normal' text
display.println("niq_ro's progr");
display.setCursor(5,40);
display.setTextColor(BLACK); // 'normal' text
display.println("version 1.0");
display.display();
delay(2000);
display.clearDisplay();
// center
display.drawCircle(x0, y0, 1, BLACK);
// master circle
display.drawCircle(x0, y0, r, BLACK);
// line 1
display.drawLine(x0,y0, x0+r, y0, BLACK);
display.display();
delay(500);
// line 2
display.drawLine(x0,y0, x0, y0+r, BLACK);
display.display();
delay(500);
// line 3
display.drawLine(x0,y0, x0-r, y0, BLACK);
display.display();
delay(500);
// line 4
display.drawLine(x0,y0, x0, y0-r, BLACK);
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
// display a moving line on circle
for (int alfa=0; alfa<60; alfa+=1)
{
display.drawLine(x0,y0, x0+r*sin(6*alfa*2*3.14/360), y0-r*cos(6*alfa*2*3.14/360), BLACK);
display.drawCircle(x0, y0, r, BLACK);
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(alfa);
if (alfa <15 || alfa>45)
{display.setCursor(25,30);}
else
{display.setCursor(25,10);}
display.println("niq_ro");
display.display();
delay(1000);
display.clearDisplay();
}
}
Ulterior, am mai adaugat si un minutar care se misca, apoi o "limba" de orar, pentru a anima am scazut timpul dintre miscari cu 2,5%...
- secundar:
- minutar:
- orar:
Sketch-ul modificat este urmatorul:
// initial version is created by niq_ro at Santuhalm (Deva)
// current version (ver. 1.1) is modified by niq_ro at Craiova (26.8.2013)
/*********************************************************************
This is an example sketch for our Monochrome Nokia 5110 LCD Displays
Pick one up today in the adafruit shop!
------> http://www.adafruit.com/products/338
These displays use SPI to communicate, 4 or 5 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// for my Nokia 5110 LCD from China
// see http://nicuflorica.blogspot.ro/2013/06/afisajul-folosit-la-telefoanele-nokia.html
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)
// Adafruit_PCD8544 display = Adafruit_PCD8544(SCLK, DIN, DC, CS, RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);
// center
int x0=84/2;
int y0=48/2;
// radius for circle
int r=23;
// angle
int alfa=0;
// lengh for minute hand (minutar)
int r1=20;
int r2=18;
// lengh for minute hand (orar)
int r3=15;
int r4=12;
// initial version is created by niq_ro at Santuhalm (Deva)
// current version (ver. 1.1) is modified by niq_ro at Craiova (26.8.2013)
void setup() {
Serial.begin(9600);
display.begin();
// init done
// you can change the contrast around to adapt the display
// for the best viewing!
display.setContrast(50);
display.clearDisplay();
// text display tests
display.setTextSize(2);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("tehnic. go.ro");
display.setTextSize(2);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println(" niq_ro ");
display.display();
delay(2000);
display.clearDisplay();
// text display tests
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0,0);
display.println(" Adafruit GFX ");
display.setCursor(15,10);
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.println(" library ");
display.setCursor(0,20);
display.setTextColor(BLACK); // 'inverted' text
display.println("--------------");
display.setCursor(0,30);
display.setTextColor(BLACK); // 'normal' text
display.println("niq_ro's progr");
display.setCursor(5,40);
display.setTextColor(BLACK); // 'normal' text
display.println("version 1.1");
display.display();
delay(2000);
display.clearDisplay();
// center
display.drawCircle(x0, y0, 1, BLACK);
// master circle
display.drawCircle(x0, y0, r, BLACK);
// line 1
display.drawLine(x0,y0, x0+r, y0, BLACK);
display.display();
delay(500);
// line 2
display.drawLine(x0,y0, x0, y0+r, BLACK);
display.display();
delay(500);
// line 3
display.drawLine(x0,y0, x0-r, y0, BLACK);
display.display();
delay(500);
// line 4
display.drawLine(x0,y0, x0, y0-r, BLACK);
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
// display a moving line on circle (as second on analog clock)
int t1 = 1000; // time beetwin moving second
for (int alfa=0; alfa<60; alfa+=1)
{
// display circle
display.drawCircle(x0, y0, r, BLACK);
// display a moving line as second
float alfa1 = 3.14*alfa/30; // convert ungle from degree in radian
display.drawLine(x0,y0, x0+r*sin(alfa1), y0-r*cos(alfa1), BLACK);
// display a text with my nickmane (niq_ro)
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(alfa);
if (alfa <15 || alfa>45)
{display.setCursor(25,30);}
else
{display.setCursor(25,10);}
display.println("niq_ro");
display.display();
delay(t1);
t1 = t1 *0.975; // reduce the time between movements
display.clearDisplay();
}
// design a new clock just with a minute hand (minutar)
int t2 = 1000; // time beetwin moving minutar
for (int alfa=0; alfa<60; alfa+=1)
{
// display circle
display.drawCircle(x0, y0, r, BLACK);
// display a moving line as second
float alfa1 = 3.14*alfa/30; // convert ungle from degree in radian
float gama = 3.14/36; // value in radian for 5 degree
// display main line for minute hand
display.drawLine(x0,y0, x0+r1*sin(alfa1), y0-r1*cos(alfa1), BLACK);
// display outside line 1
display.drawLine(x0,y0, x0+r2*sin(alfa1-gama), y0-r2*cos(alfa1-gama), BLACK);
// display outside line 2
display.drawLine(x0,y0, x0+r2*sin(alfa1+gama), y0-r2*cos(alfa1+gama), BLACK);
// display outside line 3
display.drawLine(x0+r2*sin(alfa1+gama), y0-r2*cos(alfa1+gama), x0+r1*sin(alfa1), y0-r1*cos(alfa1), BLACK);
// display outside line 4
display.drawLine(x0+r2*sin(alfa1-gama), y0-r2*cos(alfa1-gama), x0+r1*sin(alfa1), y0-r1*cos(alfa1), BLACK);
// display a text with my nickmane (niq_ro)
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(alfa);
if (alfa <15 || alfa>45)
{display.setCursor(25,30);}
else
{display.setCursor(25,10);}
display.println("niq_ro");
display.display();
delay(t2);
t2 = t2 *0.975; // reduce the time between movements
display.clearDisplay();
}
// design a new clock just with a hour hand (orar)
int t3 = 1000; // time beetwin moving minutar
for (int alfa=0; alfa<60; alfa+=1)
{
// display circle
display.drawCircle(x0, y0, r, BLACK);
// display a moving line as second
float alfa1 = 3.14*alfa/30; // convert ungle from degree in radian
float gama = 3.14/36; // value in radian for 5 degree
// display main line for minute hand
display.drawLine(x0,y0, x0+r3*sin(alfa1), y0-r3*cos(alfa1), BLACK);
// display outside line 1
display.drawLine(x0,y0, x0+r4*sin(alfa1-gama), y0-r4*cos(alfa1-gama), BLACK);
// display outside line 2
display.drawLine(x0,y0, x0+r4*sin(alfa1+gama), y0-r4*cos(alfa1+gama), BLACK);
// display outside line 3
display.drawLine(x0+r4*sin(alfa1+gama), y0-r4*cos(alfa1+gama), x0+r3*sin(alfa1), y0-r3*cos(alfa1), BLACK);
// display outside line 4
display.drawLine(x0+r4*sin(alfa1-gama), y0-r4*cos(alfa1-gama), x0+r3*sin(alfa1), y0-r3*cos(alfa1), BLACK);
// display a text with my nickmane (niq_ro)
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(alfa);
if (alfa <15 || alfa>45)
{display.setCursor(25,30);}
else
{display.setCursor(25,10);}
display.println("niq_ro");
display.display();
delay(t3);
t3 = t3 *0.975; // reduce the time between movements
display.clearDisplay();
}
}
Aceasta grafica se poate folosi sa se afiseze un ceas analog cu date citite de pe un ceas de timp real (RTC) cu DS1307, de exemplu...
15.01.2014
Deoarece intre timp afisajul a "decedat" din cauza contactului elastic prost intre cablaj si ecran, am achizitionat altul si l-am testat cu acest sketch, facand si filmuletul graphic test with my new Nokia 5110 LCD module
Fata de partea I, in care am prezentat date generale si am comandat integratul TEA5767 cu placa Arduino si am afisat date pe un LCD cu 16 coloane si 2 randuri, apoi pe unul compatibil Nokia 5110, acum voi conectata si modulul de timp real (RTC) cu integratul DS1307, astfel incat voi avea si informatii despre ora si data.
Dupa ce am modificat un pic sketch-ul anterior pentru a muta informatiile legate de frecventa radio, am urmatoarea prezentare:
Am completat sketch-ul cu partea de RTC, obtinand:
29.iun.2013 Am mai facut un filmulet, numit FM radio with TEA5767 and Arduino (IV) PS: Am conectat si senzorul DHT11 si am informatii despre temperatura si umiditate, dar pare prea "sorcova", asa ca nu am mai "bibilit" la sketch prea mult...
/********************************************************************* This is an example sketch for our Monochrome Nokia 5110 LCD Displays Pick one up today in the adafruit shop! ------> http://www.adafruit.com/products/338 These displays use SPI to communicate, 4 or 5 pins are required to interface Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, check license.txt for more information All text above, and the splash screen must be included in any redistribution *********************************************************************/ // Nokia 5110 LCD (PCD8544) from https://code.google.com/p/pcd8544/ /* niq_ro ( http://nicuflorica.blogspot.ro ) case for Nokia 5110 LCD (PCD8544) - LPH 7366: For module from China, you must connect like this: * Pin 1 (RST) -> Arduino digital 6 (D6) * Pin 2 (CE) -> Arduino digital 7 (D7) * Pin 3 (DC) -> Arduino digital 5 (D5) * Pin 4 (DIN) -> Arduino digital 4 (D4) * Pin 5 (CLK) - Arduino digital 3 (D3) * Pin 6 (Vcc) -> +5V thru adaptor module (see http://nicuflorica.blogspot.ro/2013/06/afisajul-folosit-la-telefoanele-nokia.html ) * Pin 7 (LIGHT) -> +5V thru 56-100 ohms resistor (for permanent lights) or... other pin control * Pin 8 (GND) -> GND1 or GND2 */ // Date and time functions using a DS1307 RTC connected via I2C and Wire lib // original sketck from http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/ // add part with SQW=1Hz from http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/ // adapted sketch by niq_ro from http://nicuflorica.blogspot.ro // version 4.1 for FM radio with TEA5767 - http://www.tehnic.go.ro #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> // Adafruit_PCD8544 display = Adafruit_PCD8544(SCLK, DIN, DC, CS, RST); Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6); #include <TEA5767.h> // from https://github.com/andykarpov/TEA5767 #include <Wire.h> #include <Button.h> // from http://arduino-info.wikispaces.com/file/view/Button.zip/405390486/Button.zip // TEA5767 begin TEA5767 Radio; double old_frequency; double frequency; int search_mode = 0; int search_direction; unsigned long last_pressed; Button btn_forward(11, PULLUP); Button btn_backward(12, PULLUP); // TEA5767 end #include <DHT.h> #define DHTPIN A2 // what pin we're connected DHT11 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); #include "RTClib.h" RTC_DS1307 RTC; void setup () {
Wire.begin(); Radio.init(); Radio.set_frequency(104.5); Serial.begin(9600); // sensor DHT for humidity and temperature dht.begin(); display.begin(); // init DHT done // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(55); display.clearDisplay(); RTC.begin(); // RTC.adjust(DateTime(__DATE__, __TIME__)); // if you need set clock... just remove // from line above this // part code for flashing LED Wire.beginTransmission(0x68); Wire.write(0x07); // move pointer to SQW address // Wire.write(0x00); // turns the SQW pin off Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave at 1Hz // Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) 32kHz Wire.endTransmission(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } // Print a logo message to the LCD. display.setTextSize(1); display.setTextColor(BLACK); display.setCursor(8,0); display.println("tehnic.go.ro"); display.setCursor(20, 8); display.print("& niq_ro"); display.setCursor(16, 24); display.print("radio FM"); display.setCursor(5, 32); display.print("si ceas/data"); display.setCursor(0, 40); display.print("versiunea "); display.setTextColor(WHITE, BLACK); display.print("4.1"); display.display(); delay (5000); display.clearDisplay(); } void loop () { DateTime now = RTC.now(); unsigned char buf[5]; int stereo; int signal_level; double current_freq; unsigned long current_millis = millis(); if (Radio.read_status(buf) == 1) { current_freq = floor (Radio.frequency_available (buf) / 100000 + .5) / 10; stereo = Radio.stereo(buf); signal_level = Radio.signal_level(buf);
display.setTextSize(2); display.setTextColor(BLACK); if (current_freq >=100) display.setCursor(0,16); else display.setCursor(12,16); display.print(display.print(current_freq)); // erase 2 number from right for (int x = 16; x < 30; x++) { display.drawLine(60, x, 84, x, WHITE); } display.setTextSize(1); display.setCursor(65,16); display.print("MHz");
display.setCursor(65,24); display.setTextSize(1); display.setTextColor(WHITE, BLACK); if (stereo) display.print("ST"); else display.print(" "); // read value from DHT sensor int h = dht.readHumidity(); int t = dht.readTemperature(); display.setTextColor(BLACK); display.setCursor(6,32); display.setTextSize(1); display.print(h); display.print("%H"); display.setCursor(0,40); display.setTextColor(WHITE, BLACK); display.print("+"); display.print(t); display.print("^C "); display.display(); delay (500); display.clearDisplay(); // draw a signal level triangle... display.drawLine(80, 30, 80, 45, BLACK); display.drawLine(80, 45, 50, 45, BLACK); display.drawLine(50, 45, 80, 30, BLACK); // draw an antenna display.drawLine(55, 32, 55, 40, BLACK); display.drawLine(56, 32, 56, 40, BLACK); display.drawLine(52, 32, 55, 36, BLACK); display.drawLine(51, 32, 55, 37, BLACK); display.drawLine(59, 32, 56, 36, BLACK); display.drawLine(60, 32, 56, 37, BLACK); int sl = signal_level; for (int x = 0; x < sl; x++) { display.drawLine(50+2*x, 45, 50+2*x, 45-x, BLACK); } } if (search_mode == 1) { if (Radio.process_search (buf, search_direction) == 1) { search_mode = 0; } } if (btn_forward.isPressed()) { last_pressed = current_millis; search_mode = 1; search_direction = TEA5767_SEARCH_DIR_UP; Radio.search_up(buf); delay(300); } if (btn_backward.isPressed()) { last_pressed = current_millis; search_mode = 1; search_direction = TEA5767_SEARCH_DIR_DOWN; Radio.search_down(buf); delay(300); } delay(100); // need for display time int zs = now.second()/10; int us = now.second() - zs*10; if (us > 2 ) { display.setTextSize(2); display.setTextColor(BLACK); display.setCursor(0, 0); { if ( now.hour() < 10) { display.print(" "); display.print(now.hour(), DEC); } else { display.print(now.hour(), DEC); } display.setCursor(20, 0); display.print(":"); display.setCursor(28, 0); if ( now.minute() < 10) { display.print("0"); display.print(now.minute(), DEC); } else { display.print(now.minute(), DEC); }