Aplicații

E-mail 1002 Solutii

Cum se instalează CSF (Config Server Firewall) pe Debian 12

CSF sau Config Server Firewall este un firewall Stateful Packet Inspection (SPI) bazat pe IPtables și Perl. Acesta oferă un proces daemon care monitorizează serviciile dvs. pentru erori și autentificare și oferă, de asemenea, integrare cu interfața web pentru gestionarea serverelor bazate pe web, cum ar fi Webmin, cPanel și DirectAdmin.

În acest tutorial, vă vom ghida prin procesul de instalare a CSF (Config Server Firewall) pe serverul Debian 12. Veți învăța, de asemenea, configurația de bază a CSF, blocarea adreselor IP folosind două metode diferite și configurarea interfeței web CSF pentru o gestionare și monitorizare ușoară.

ACTUALIZARE: Firewall-ul CSF a fost închis în august 2025. Puteți utiliza în schimb fork-ul său, Sentinel Firewall:

Cerințe preliminare

Pentru a începe cu acest tutorial, asigură-te că ai următoarele:

  • Un server Debian 12.
  • Un utilizator non-root cu privilegii de administrator.

Pregătirea sistemului

Înainte de a instala CSF, trebuie să vă asigurați că dependențele sunt instalate. Acestea includ pachete precum Perl și iptables. De asemenea, atunci când rulează un alt firewall, cum ar fi UFW (Uncomplicated Firewall), trebuie să îl dezactivați.

Pentru a începe, executați următoarea comandă pentru a actualiza depozitul Debian.

sudo apt update


După ce repozitoriul este actualizat, instalați următoarele dependențe pentru CSF folosind comanda de mai jos.

sudo apt install libio-socket-inet6-perl libsocket6-perl sendmail dnsutils unzip libio-socket-ssl-perl libcrypt-ssleay-perl git perl iptables libnet-libidn-perl libwww-perl liblwp-protocol-https-perl libgd-graph-perl

Tastați Y și apăsați ENTER pentru a continua.


În cele din urmă, trebuie să dezactivați UFW dacă îl aveți pe serverul Debian. CSF folosește implicit iptables ca firewall și filtru de pachete.

sudo ufw disable

Descărcarea și instalarea CSF-ului

În secțiunea următoare, veți descărca și instala manual CSF (Config Server Firewall) din sursă. Așadar, haideți să începem.

Descărcați codul sursă CSF folosind comanda wget de mai jos. Veți vedea fișierul csf.tgz.

wget http://download.configserver.com/csf.tgz

Acum extrageți fișierul csf.tgz folosind comanda tar de mai jos. Codul sursă CSF va fi disponibil în directorul csf.

sudo tar -xvzf csf.tgz

Apoi, mutați-vă în directorul csf și executați scriptul install.sh pentru a porni instalarea.

cd csf; sh install.sh

Când pornește instalarea, ar trebui să obțineți următoarele:

Când procesul este finalizat, ar trebui să primiți mesajul „Instalare finalizată” .

Acum că CSF este instalat, verificați-l folosind comanda de mai jos.

perl /usr/local/csf/bin/csftest.pl

Asigurați-vă că rezultatul fiecărui test de caracteristici este OK 

În cele din urmă, executați următoarea comandă pentru a verifica locația și versiunea fișierului binar CSF.

which csf
csf -v

În următoarea ieșire, puteți vedea că CSF v14.20 este instalat în /usr/sbin/csf .

Configurarea CSF-ului

După ce ați instalat CSF, veți învăța câteva configurații de bază ale CSF (Config Server Firewall). Directorul principal de configurare pentru CSF este directorul /etc/csf , unde veți găsi fișierul principal de configurare CSF, csf.conf .

Folosește următoarea comandă din editorul nano pentru a deschide fișierul de configurare CSF /etc/csf/csf.conf .

sudo nano /etc/csf/csf.conf

Permiteți traficul prin CSF

Găsiți opțiunile TCP_* și UDP_* și adăugați porturile.

# Se permit porturile TCP de intrare 
TCP_IN = "20,21,22,25,53,853,80,110,143,443,465,587,993,995" 

# Se permit porturile TCP de ieșire 
TCP_OUT = "20,21,22,25,53,853,80,110,113,443,587,993,995" 

# Se permit porturile UDP de intrare 
UDP_IN = "20,21,53,853,80,443" 

# Se permit porturile UDP de ieșire 
# Pentru a permite traceroute-ul de ieșire, adăugați 33434:33523 la această listă 
UDP_OUT = "20,21,53,853,113,123"


Opțiuni detaliate:

  • TCP_IN : permite traficul de intrare către porturile TCP.
  • TCP_OUT : permite traficul de ieșire către anumite porturi TCP.
  • UDP_IN : permite traficul de intrare către porturile UDP.
  • UDP_OUT : permite traficul de ieșire către anumite porturi UDP.

Permite/Refuză cererile Ping sau ICMP

Dacă trebuie neapărat să dezactivați Ping sau ICMP „IN și OUT”, utilizați următoarele opțiuni. „ICMP_IN = 1” înseamnă că ping-ul va fi permis, iar „ICMP_OUT = 1” înseamnă că serverul poate face ping către o altă rețea.

# Se permite PING-ul primit. Dezactivarea PING-ului va întrerupe probabil timpul de funcționare extern 
# monitorizare 
ICMP_IN = "1" 
... 
# Se permite PING-ul trimis 
# 
# Dacă nu există un motiv anume, această opțiune NU ar trebui dezactivată, deoarece 
# ar putea întrerupe funcționalitatea sistemului de operare 
ICMP_OUT = "1"


Protecție Synflood

ACTIVAȚI această opțiune DOAR atunci când este necesar, de exemplu împotriva atacurilor DOS asupra serverului dumneavoastră.

############################################################################### 
# SECȚIUNE: Setări Port Flood 
################################################################################ 
# Activează protecția împotriva SYN Flood. Această opțiune configurează iptables pentru a oferi o anumită 
# protecție împotriva încercărilor DOS de trimitere a pachetelor tcp SYN. 
​​... 
SYNFLOOD = "0" 
SYNFLOOD_RATE = "100/s" 
SYNFLOOD_BURST = "150"


Limitarea conexiunilor simultane

Apoi, utilizați opțiunea „CONNLIMIT” pentru a limita conexiunile simultane pentru anumite porturi. Formatul este „ PORT;LIMIT ”, de exemplu, configurația „ 22;5 ” va limita portul SSH la doar 5 conexiuni simultane .

# Protecție la limita conexiunii. Această opțiune configurează iptables pentru a oferi 
o protecție sporită # împotriva atacurilor DOS împotriva anumitor porturi. Poate fi folosită și ca o 
# modalitate de a limita pur și simplu utilizarea resurselor în funcție de adresa IP pentru anumite servicii de server. 
# Notă: Rulați /etc/csf/csftest.pl pentru a verifica dacă această opțiune va funcționa pe 
# acest server 
CONNLIMIT = "22;5,21;10"

Dezactivați modul TESTARE și restricționați accesul la Syslog

Acum, dacă ați configurat totul și ați adăugat porturile, schimbați „ TESTING ” la „ 1 ” și restricționați accesul la socket-urile rsyslog cu „ RESTRICT_SYSLOG= “3” ”.

# lfd nu va porni cât timp această opțiune este activată 
TESTING = "0" 

... 
# 0 = Permite utilizarea și configurarea opțiunilor enumerate mai sus 
# 1 = Dezactivează toate opțiunile enumerate mai sus și împiedică utilizarea lor 
# 2 = Dezactivează doar alertele despre această funcție și nu face nimic altceva 
# 3 = Restricționează accesul syslog/rsyslog la RESTRICT_SYSLOG_GROUP ** RECOMANDAT ** 
RESTRICT_SYSLOG = "3"

Când totul este gata, salvați fișierul și ieșiți din editor.

Testarea și pornirea serviciului CSF

Acum executați comanda csf de mai jos pentru a verifica configurația. Dacă aveți configurația CSF corectă, veți vedea ieșirea CSF. În schimb, veți vedea eroarea detaliată atunci când configurația este incorectă.

csf -v

Apoi, executați comanda systemctl de mai jos pentru a porni serviciile csf și lfd.

sudo systemctl pornește csf lfd


Odată ce serviciul csf rulează, veți fi deconectat automat de la server. Vă puteți conecta din nou la server, apoi puteți verifica atât serviciul csf, cât și serviciul lfd folosind comanda de mai jos.

sudo systemctl status csf lfd

Puteți vedea că serviciul csf rulează.

De asemenea, puteți vedea că serviciul lfd rulează.

Blocare prin CSF

În acest moment, ați învățat configurația de bază pentru CSF (Config Server Firewall). Acum haideți să aruncăm o privire la blocarea adreselor IP prin CSF.

Blocarea adreselor IP prin intermediul listelor de blocare IP

Deschideți configurația implicită a listelor de blocuri IP /etc/csf/csf.blocklists folosind comanda editorului nano de mai jos.

sudo nano /etc/csf/csf.blocklists

Decomentați următoarele linii pentru a bloca adresele IP din baza de date Spamhaus .

# Lista Spamhaus Don't Route Or Peer List (DROP) 
# Detalii: http://www.spamhaus.org/drop/ 
SPAMDROP|86400|0|http://www.spamhaus.org/drop/drop.txt 

# Lista Spamhaus IPv6 Don't Route Or Peer List (DROPv6) 
# Detalii: http://www.spamhaus.org/drop/ 
SPAMDROPV6|86400|0|https://www.spamhaus.org/drop/dropv6.txt 

# Lista Spamhaus extinsă DROP (EDROP) 
# Detalii: http://www.spamhaus.org/drop/ 
SPAMEDROP|86400|0|http://www.spamhaus.org/drop/edrop.txt

Salvați fișierul și ieșiți din editor când ați terminat.

Mai jos sunt câteva opțiuni pentru detalii:

  • SPAMDROP : numele blocului care va fi folosit ca nume pentru canalul iptables. Folosiți doar LITERE MARI, cu maximum 25 de caractere.
  • 86400 : interval de reîmprospătare pentru descărcarea și reînnoirea adreselor IP ale listelor de blocare.
  • MAX : numărul maxim de adrese IP care vor fi utilizate din listă. O valoare de 0 înseamnă că toate adresele IP vor fi incluse.
  • URL : URL-ul de descărcare al adreselor IP din listele de blocare.

Blocarea adreselor IP prin GeoIP

O altă metodă de a bloca o adresă IP este prin GeoIP, care vă permite să blocați traficul primit dintr-o anumită țară.

Folosește următoarea comandă din editorul nano pentru a deschide configurația CSF „ /etc/csf/csf.conf ”.

sudo nano /etc/csf/csf.conf

Găsiți parametrii CC_DENY și CC_ALLOW pentru a configura blocarea pe țări prin GeoIP.

# Fiecare opțiune este o listă de CC-uri separate prin virgulă, de exemplu „US,GB,DE” 
CC_DENY = "RU,CN" 
CC_ALLOW = "US,GB,DE,NL,SG"

În mod implicit, CSF utilizează baza de date GeoIP din db-ip, ipdeny și iptoasn . Dar o puteți modifica și prin intermediul bazei de date GeoIP MaxMind . Pentru a utiliza baza de date MaxMind , schimbați „ CC_SRC ” la „ 1 ”, apoi introduceți cheia de licență MaxMind în opțiunea „ MM_LICENSE_KEY ”.

# Cheie de licență MaxMind: 
MM_LICENSE_KEY = "" 

... 

# Setați următoarele la sursa preferată: 
# 
# "1" - MaxMind 
# "2" - db-ip, ipdeny, iptoasn 
# 
# Implicit este "2" pentru instalările noi de csf sau setați la "1" pentru a utiliza 
# bazele de date MaxMind după obținerea unei chei de licență 
CC_SRC = "1"

Salvați fișierul și ieșiți din editor când ați terminat.

Acum, executați următoarea comandă pentru a verifica configurația CSF. Dacă nu există nicio eroare, ar trebui să obțineți versiunea CSF.

sudo csf -v

Apoi, reporniți ambele servicii, csf și lfd, folosind următoarea comandă.

sudo csf -ra

Ar trebui să vedeți o ieșire ca următoarea:

Pentru a vă asigura că atât csf, cât și lfs rulează, utilizați următoarea comandă pentru a verifica ambele servicii.

sudo systemctl status csf lfd

Activează interfața web CSF

În secțiunea următoare, veți învăța cum să activați interfața web CSF pentru monitorizare prin intermediul unui browser web.

Deschideți configurația CSF folosind următorul editor nano.

sudo nano /etc/csf/csf.conf

Schimbați opțiunea „ UI ” la „ 1 ” și activați interfața web CSF. Apoi, ajustați UI_PORT, UI_IP, UI_USER și UI_PASS cu datele dvs.

# 
# 1 pentru activare, 0 pentru dezactivare 
UI = "1" 

... 

# NU activați accesul la acest port în TCP_IN, ci permiteți accesul doar 
la IP-uri de încredere # utilizând Filtre avansate de permisiune (consultați readme.txt) 
UI_PORT = "1048" 

... 

# Dacă serverul este configurat pentru IPv6, dar adresa IP la care se face legătura este IPv4, atunci 
# adresa IP TREBUIE să utilizeze reprezentarea IPv6. De exemplu, 1.2.3.4 trebuie să utilizeze 
# ::ffff:1.2.3.4 
# 
# Lăsați necompletat pentru a vă conecta la toate adresele IP de pe server 
UI_IP = "127.0.0.1" 

... 

# Acesta ar trebui să fie un nume de utilizator securizat, greu de ghicit 
# 
# Acesta trebuie modificat față de valoarea implicită 
UI_USER = "alice" 
... 
# numere și caractere non-alfanumerice 
# 
# Acesta trebuie modificat față de valoarea implicită 
UI_PASS = "passw0rd"

Salvați fișierul și ieșiți din editor când ați terminat.

Acum găsiți adresa IP publică folosind comanda de mai jos.

curl https://ipinfo.io/

Adăugați adresa IP la configurațiile „ /etc/csf/csf.allow ” și „ /etc/csf/ui/ui.allow ”. Aceasta va include adresa IP publică pe lista albă și vă va permite accesul la interfața web CSF și la server.

# IP unic 
192.168.5.1 

# Subrețea 
192.168.5.0/24

După aceea, executați comanda de mai jos pentru a verifica configurația CSF și a reporni ambele servicii, csf și lfd.

sudo csf -v 
sudo csf -ra

Apoi, verificați lista adreselor IP de pe lista albă de pe CSF folosind comanda de mai jos. Găsiți lanțul iptables ALLOWIN și ALLOWOUT și ar trebui să vedeți adresele IP de pe lista albă.

sudo csf -l

Acum deschideți browserul web și accesați adresa IP a serverului, urmată de portul interfeței web CSF (de exemplu: https://192.168.5.15:1048). Dacă configurarea a avut succes, ar trebui să vedeți pagina de conectare CSF.

Introduceți numele de utilizator și parola de administrator, apoi faceți clic pe ENTER .

Ar trebui să vedeți tabloul de bord CSF astfel:

[mai mult...]

Cum eliminam complet Microsoft Edge

Fie ca suntem deranjati de Microsoft Edge, fie ca ne-am hotarat sa folosim un alt browser pentru navigarea pe internet sau intampinam incompatibilitati software, exista momente cand dorinta de a-l elimina rapid poate fi o salvare.

Edge Remover, asa cum sugereaza si numele sau, a fost conceput pentru a face un singur lucru, si numai un singur lucru: dezinstaleaza Microsoft Edge din sistem. Edge Remover simplifica procesul de eliminare a Microsoft Edge Browser si WebView2 oferind doua optiuni: eliminarea Edge Browser impreuna cu WebView2 sau eliminarea doar a Edge Browser. Aplicatia nu are o interfata grafica si prezinta in schimb o singura fereastra pop-up cu optiunile disponibile. Dupa ce selectam o optiune, aplicatia executa imediat sarcina.

[mai mult...]

RFID Door Lock with Arduino

In this detailed guide, you’ll learn how to build an RFID door lock system using an Arduino Uno and an MFRC522 RFID reader. The system reads RFID cards or keyfobs, checks authorization, and controls a solenoid lock or servo latch to grant access. It’s perfect for home automation, maker projects, or educational demonstrations.

Solenoid Lock Wiring

Arduino D7 → Gate of MOSFET (via 100Ω resistor)
MOSFET Source → GND (common)
MOSFET Drain → Solenoid negative terminal
Solenoid positive → +12V
12V supply GND → Arduino GND
Flyback diode across solenoid (1N4007, cathode to +12V)

Optional Servo Connection

Servo Signal → D7 (PWM)
Servo V+ → 5V external supply
Servo GND → Common GND

Arduino Code — Basic Version

This version uses a hard-coded list of authorized RFID tags.

/* RFID Door Lock - Basic Version */
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

#define RST_PIN 9
#define SDA_PIN 10
MFRC522 rfid(SDA_PIN, RST_PIN);

#define ACTUATOR_TYPE 0  // 0=Solenoid/Relay, 1=Servo
const int RELAY_PIN = 7;
const int LED_PIN = 4;
const int BUZZER_PIN = 5;
const int SERVO_PIN = 7;
const unsigned long UNLOCK_MS = 3000;
Servo lockServo;

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  if (ACTUATOR_TYPE == 0) {
    pinMode(RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN, LOW);
  } else {
    lockServo.attach(SERVO_PIN);
    lockServo.write(0);
  }
  Serial.println("RFID door lock ready");
}

// Replace these with your own card UIDs
byte allowedUIDs[][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF},
  {0x11, 0x22, 0x33, 0x44}
};
const int allowedCount = sizeof(allowedUIDs)/4;

bool uidAllowed(byte *uid, byte uidSize) {
  if (uidSize != 4) return false;
  for (int i=0;i<allowedCount;i++) {
    bool match = true;
    for (int j=0;j<4;j++) if (allowedUIDs[i][j] != uid[j]) { match = false; break; }
    if (match) return true;
  }
  return false;
}

void unlockAction() {
  Serial.println("UNLOCK!");
  digitalWrite(LED_PIN, HIGH);
  tone(BUZZER_PIN, 1000, 150);
  if (ACTUATOR_TYPE == 0) {
    digitalWrite(RELAY_PIN, HIGH);
    delay(UNLOCK_MS);
    digitalWrite(RELAY_PIN, LOW);
  } else {
    lockServo.write(90);
    delay(UNLOCK_MS);
    lockServo.write(0);
  }
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

  Serial.print("Card UID:");
  for (byte i=0;i<rfid.uid.size;i++) {
    Serial.print(" ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();

  if (uidAllowed(rfid.uid.uidByte, rfid.uid.size)) {
    Serial.println("Access granted");
    unlockAction();
  } else {
    Serial.println("Access denied");
    for (int i=0;i<2;i++) {
      tone(BUZZER_PIN, 600, 150);
      digitalWrite(LED_PIN, HIGH);
      delay(200);
      digitalWrite(LED_PIN, LOW);
      delay(100);
    }
  }

  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}

Advanced Version — Store Tags in EEPROM

This version allows adding and removing authorized cards dynamically through the Serial Monitor.

/* RFID Door Lock - EEPROM Version */
#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>

#define RST_PIN 9
#define SDA_PIN 10
MFRC522 rfid(SDA_PIN, RST_PIN);

#define RELAY_PIN 7
#define LED_PIN 4
#define BUZZER_PIN 5
#define UNLOCK_MS 3000
#define MAX_TAGS 20
#define UID_SIZE 4
#define EEPROM_START 0

void setup() {
  Serial.begin(115200);
  SPI.begin();
  rfid.PCD_Init();
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  Serial.println("RFID lock with EEPROM ready");
}

/* Helper functions omitted for brevity in this preview — see full code in guide */

Serial commands:

  • l — List stored tags
  • a — Add a new tag (scan after command)
  • r — Remove a tag
  • c — Clear all stored tags

Power Considerations

  • Use a separate 12V supply for the solenoid; common the grounds.
  • Add a large capacitor (470µF–2200µF) across the solenoid supply.
  • Always include a flyback diode to protect electronics.
  • If using a servo, power it from an external 5V supply.

Mechanical Installation

  • Ensure alignment between lock and strike plate.
  • Provide a manual override or emergency key.
  • Mount RFID reader within 5–10 cm of tag presentation area.
  • Keep metal objects away from the RC522 antenna.

Testing Steps

  1. Upload code and open Serial Monitor (115200 baud).
  2. Scan a card — its UID should appear.
  3. Add card to allowed list or EEPROM memory.
  4. Test actuator operation and timing.
  5. Confirm power supply stability under load.

Troubleshooting

Issue Possible Cause Fix
No response from reader Wrong wiring or 5V used Use 3.3V and correct SPI pins
Actuator not moving Power supply too weak or wrong driver Use proper MOSFET/relay and check GND
UIDs print gibberish Wrong Serial baud rate Match Serial.begin(115200)
Unstable lock Power noise Add capacitor or separate supply

Security Enhancements

  • Use MIFARE DESFire or NTAG cards for better encryption.
  • Add a keypad for two-factor access (RFID + PIN).
  • Implement attempt-limit lockout for brute-force protection.
  • Use metal enclosure and tamper switch for extra security.

Optional Upgrades

  • OLED/LCD display for user feedback
  • Wi-Fi / MQTT integration (ESP8266 or ESP32)
  • RTC + SD card logging for audit trail
  • Battery backup for power loss protection
  • Cloud dashboard or mobile control app.
[mai mult...]

Arduino Temperature Sensor

You’ll build a simple digital thermometer that measures ambient temperature using a temperature sensor (like the LM35, TMP36, or DHT11) and displays the reading via the Serial Monitor or LCD screen.

We’ll cover two main versions:

  1. Basic Version — Using an analog temperature sensor (LM35 or TMP36).

  2. Advanced Version — Using a digital sensor (DHT11 or DHT22) with humidity support.

Materials Needed

Component Quantity Description
Arduino Uno (or Nano/Mega) 1 The main microcontroller board
LM35 or TMP36 sensor 1 Analog temperature sensor
Breadboard 1 For easy circuit assembly
Jumper wires ~6 Male-to-male wires
USB cable 1 To connect Arduino to your computer
(Optional) 16×2 LCD Display 1 For local display
(Optional) 10kΩ Potentiometer 1 LCD contrast control

Step 1: Understand the Sensor

 LM35 Pinout

Pin Label Function
1 VCC +5V from Arduino
2 VOUT Analog output (connect to Arduino analog input)
3 GND Ground

The LM35 outputs 10 mV per °C.
So if the output voltage = 250 mV → temperature = 25°C.

Step 2: Wiring the LM35 to Arduino

Connections

LM35 Pin Connects To
VCC 5V on Arduino
GND GND on Arduino
VOUT A0 on Arduino

Circuit Diagram (Text Form)

[Arduino 5V] ---- [LM35 VCC]
[Arduino GND] ---- [LM35 GND]
[Arduino A0] ---- [LM35 OUT]

Step 3: Arduino Code (LM35 Version)

// Simple Temperature Sensor with LM35

const int sensorPin = A0; // LM35 connected to A0
float temperatureC;

void setup() {
Serial.begin(9600);
Serial.println(“LM35 Temperature Sensor”);
}

void loop() {
int sensorValue = analogRead(sensorPin); // Read analog value
float voltage = sensorValue * (5.0 / 1023.0); // Convert to voltage
temperatureC = voltage * 100; // 10mV per degree C (LM35)

Serial.print(“Temperature: “);
Serial.print(temperatureC);
Serial.println(” °C”);

delay(1000); // Update every second
}

Explanation

  • analogRead(A0): reads 0–1023 corresponding to 0–5V.

  • Voltage calculation: (value * 5.0) / 1023.0.

  • LM35 output scaling: 10 mV = 1°C → multiply voltage by 100.

Step 4: Viewing Data

  • Open Arduino IDE → Tools → Serial Monitor.

  • Set baud rate = 9600.

  • You’ll see continuous readings like:

    Temperature: 24.87 °C
    Temperature: 25.02 °C

Step 5: Calibration (Optional)

Real sensors may have small offsets.
You can adjust the output manually:

temperatureC = (voltage * 100) - 0.5; // Adjust by small offset

Compare readings with a known thermometer and tweak the offset until accurate.

Advanced: Using DHT11 / DHT22 (Digital Sensor)

Required Library

  • Install “DHT sensor library” by Adafruit from Arduino Library Manager.

Wiring (DHT11)

DHT11 Pin Connects To
VCC 5V
GND GND
DATA Digital Pin 2

Code (DHT11)

#include "DHT.h"

#define DHTPIN 2 // Data pin connected to digital pin 2
#define DHTTYPE DHT11 // or DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
dht.begin();
}

void loop() {
float tempC = dht.readTemperature();
float humidity = dht.readHumidity();

if (isnan(tempC) || isnan(humidity)) {
Serial.println(“Failed to read from DHT sensor!”);
return;
}

Serial.print(“Temperature: “);
Serial.print(tempC);
Serial.print(” °C, Humidity: “);
Serial.print(humidity);
Serial.println(” %”);

delay(2000);
}

Step 6: (Optional) Display on LCD

If using a 16×2 LCD (I2C):

  1. Install “LiquidCrystal_I2C” library.

  2. Connect SDA → A4, SCL → A5.

  3. Example snippet:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
lcd.init();
lcd.backlight();
}

void loop() {
lcd.setCursor(0, 0);
lcd.print(“Temp: “);
lcd.print(temperatureC);
lcd.print(“C”);
}

Troubleshooting Guide

Issue Possible Cause Solution
No readings / 0°C Wrong wiring or pin Check sensor pins
Negative readings Wrong sensor type (TMP36 needs offset) Adjust formula
Unstable readings Noisy analog signal Add capacitor (0.1 µF) between VOUT & GND
“nan” or “Failed to read” DHT library issue Check sensor type & connections

Next Steps & Enhancements

  • Add OLED / LCD display for portable thermometer

  • Store data using SD card module

  • Upload readings to the cloud via ESP8266 / WiFi module

  • Use RGB LED to indicate temperature range (blue/cool, red/hot)

  • Build an IoT dashboard (ThingSpeak, Blynk, etc.).

[mai mult...]