Digitales Schema eines elektronischen Abstimmungssystems, gesteuert von einer Raspberry Pi Platine

Ein elektronisches Abstimmungssystem mit dem Raspberry Pi erstellen

Einführung

In diesem Artikel erstellen wir ein elektronisches Abstimmungssystem mit einem Raspberry Pi und Raspbian. Dieses Projekt eignet sich ideal für Schulen, kleine Organisationen oder jede Umgebung, die ein einfaches, zuverlässiges und sicheres Abstimmungssystem benötigt.

Benötigte Hardware

  • Eine Raspberry Pi (Modell 3 oder höher empfohlen)
  • Eine microSD-Karte (mindestens 8 GB) mit installiertem Raspbian
  • Ein Bildschirm und eine Tastatur für den Raspberry Pi
  • Eine Internetverbindung zum Herunterladen der benötigten Pakete
  • Ein RFID-Kartenleser und RFID-Karten (optional, aber zur Identifizierung der Wähler empfohlen)
  • Kabel und Netzteil für den Raspberry Pi
  • Breadboard und Verkabelung für die Verbindungen (bei Verwendung zusätzlicher Peripheriegeräte)
  • Ein Gehäuse für den Raspberry Pi (optional, aber zum Schutz empfohlen)

Installation von Raspbian

  1. Laden Sie die neueste Version von Raspbian von der offiziellen Raspberry-Pi-Website herunter: Raspbian Download.
  2. Verwenden Sie ein Tool wie Balena Etcher, um das Raspbian-Image auf Ihre microSD-Karte zu flashen.
  3. Stecken Sie die microSD-Karte in den Raspberry Pi, schließen Sie Bildschirm, Tastatur und Netzteil an und starten Sie dann den Raspberry Pi.

Ersteinrichtung

  1. Öffnen Sie das Terminal und aktualisieren Sie Ihr System: sudo apt update sudo apt upgrade
  2. Installieren Sie die für die Entwicklung benötigten Pakete: sudo apt install python3 python3-pip python3-gpiozero

Konfiguration des Webservers

Wir verwenden Flask, um eine Webanwendung zu erstellen, die als Oberfläche für unser Abstimmungssystem dient.

Warum Flask?

Flask ist ein Web-Mikroframework in Python, das schlank und einfach zu bedienen ist und sich perfekt für kleine Anwendungen wie unser Abstimmungssystem eignet. Damit können wir einfache Routen anlegen und HTML-Templates rendern, genau das, was wir brauchen.

Installation von Flask

  1. Installieren Sie Flask: pip3 install flask
  2. Erstellen Sie einen Ordner für Ihr Projekt und wechseln Sie hinein: mkdir voting_system cd voting_system

Erstellen der Flask-Anwendung

Erstellen Sie eine Datei app.py mit folgendem Inhalt:

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)

# Dictionnaire pour stocker les électeurs et leurs votes
voters = {}
# Dictionnaire pour stocker les votes par candidat
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

@app.route('/')
def index():
    # Rendre le template index.html avec les votes actuels
    return render_template('index.html', votes=votes)

@app.route('/vote', methods=['POST'])
def vote():
    # Récupérer l'ID de l'électeur et le candidat choisi depuis le formulaire
    voter_id = request.form['voter_id']
    candidate = request.form['candidate']

    # Vérifier si l'électeur a déjà voté
    if voter_id in voters:
        return "Voter has already voted"

    # Enregistrer le vote
    voters[voter_id] = candidate
    votes[candidate] += 1

    # Rediriger vers la page d'accueil
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Erklärung des Codes

Importe und Ersteinrichtung:

from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)

Hier importieren wir Flask und die benötigten Funktionen. Wir erstellen eine Instanz der Flask-Anwendung.

Speicherung der Stimmen:

voters = {}
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

Wir verwenden zwei Dictionaries: voters um festzuhalten, welche Wähler abgestimmt haben, und votes um die Stimmen für jeden Kandidaten zu zählen.

Route der Startseite:

@app.route('/')
def index():
    return render_template('index.html', votes=votes)

Die Funktion index rendert die Startseite und übergibt dabei die aktuellen Stimmen an das Template.

Route für die Abstimmung:

@app.route('/vote', methods=['POST'])
def vote():
    voter_id = request.form['voter_id']
    candidate = request.form['candidate']

    if voter_id in voters:
        return "Voter has already voted"

    voters[voter_id] = candidate
    votes[candidate] += 1

    return redirect(url_for('index'))

Die Funktion vote verarbeitet POST-Anfragen. Sie liest die ID des Wählers und den gewählten Kandidaten aus, prüft, ob der Wähler bereits abgestimmt hat, speichert die Stimme und leitet zur Startseite weiter.

Erstellen des HTML-Templates

Erstellen Sie einen Ordner templates und erstellen Sie darin eine Datei index.html :

<!DOCTYPE html>
<html>
<head>
    <title>Voting System</title>
</head>
<body>
    <h1>Vote for Your Candidate</h1>
    <form action="/vote" method="post">
        <label for="voter_id">Voter ID:</label>
        <input type="text" id="voter_id" name="voter_id" required><br><br>
        <label for="candidate">Choose a candidate:</label>
        <select id="candidate" name="candidate">
            <option value="Candidate1">Candidate1</option>
            <option value="Candidate2">Candidate2</option>
            <option value="Candidate3">Candidate3</option>
        </select><br><br>
        <input type="submit" value="Vote">
    </form>
    <h2>Current Votes</h2>
    <ul>
        {% for candidate, count in votes.items() %}
            <li>{{ candidate }}: {{ count }}</li>
        {% endfor %}
    </ul>
</body>
</html>

Erklärung des Templates

Abstimmungsformular:

<form action="/vote" method="post">
    <label for="voter_id">Voter ID:</label>
    <input type="text" id="voter_id" name="voter_id" required><br><br>
    <label for="candidate">Choose a candidate:</label>
    <select id="candidate" name="candidate">
        <option value="Candidate1">Candidate1</option>
        <option value="Candidate2">Candidate2</option>
        <option value="Candidate3">Candidate3</option>
    </select><br><br>
    <input type="submit" value="Vote">
</form>

Über das Formular gibt der Wähler seine ID ein und wählt einen Kandidaten. Die Daten werden an die Route /vote per POST gesendet.

Anzeige der aktuellen Stimmen:

<h2>Current Votes</h2>
<ul>
    {% for candidate, count in votes.items() %}
        <li>{{ candidate }}: {{ count }}</li>
    {% endfor %}
</ul>

Dieser Abschnitt zeigt die aktuelle Stimmenzahl jedes Kandidaten an und nutzt dazu die for Schleife von Jinja2 zum Durchlaufen der Elemente des Dictionarys votes.

Anwendung starten

  1. Starten Sie Ihre Flask-Anwendung: python3 app.py
  2. Öffnen Sie die Weboberfläche in Ihrem Browser unter der Adresse http://<IP_DU_RASPBERRY_PI>:5000.

Verwendung eines RFID-Kartenlesers (optional)

Für mehr Sicherheit können Sie einen RFID-Kartenleser zur Identifizierung der Wähler verwenden.

Warum einen RFID-Kartenleser verwenden?

Ein RFID-Kartenleser bietet eine zusätzliche Sicherheitsebene: Jeder Wähler wird eindeutig identifiziert, und die Stimmen können nicht von Unbefugten manipuliert werden.

Installation des RFID-Kartenlesers

  1. Installieren Sie die für den RFID-Leser benötigten Bibliotheken: pip3 install mfrc522
  2. Schließen Sie den RFID-Leser gemäß den Anweisungen des Herstellers an den Raspberry Pi an.

Integration des RFID-Lesers in die Flask-Anwendung

Ändern Sie die Datei app.py , um das Auslesen von RFID-Karten einzubinden:

from flask import Flask, render_template, request, redirect, url_for
from mfrc522 import SimpleMFRC522
import RPi.GPIO as GPIO

app = Flask(__name__)
reader = SimpleMFRC522()

voters = {}
votes = {"Candidate1": 0, "Candidate2": 0, "Candidate3": 0}

@app.route('/')
def index():
    return render_template('index.html', votes=votes)

@app.route('/vote', methods=['POST'])
def vote():
    try:
        # Lecture de l'ID de la carte RFID
        id, text = reader.read()
        voter_id = str(id)
        candidate = request.form['candidate']

        if voter_id in voters:
            return "Voter has already voted"

        voters[voter_id] = candidate
        votes[candidate] += 1

        return redirect(url_for('index'))
    finally:
        GPIO.cleanup()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Explication des Modifications

Zusätzliche Importe:

from mfrc522 import SimpleMFRC522
import RPi.GPIO as GPIO

Wir importieren die für den RFID-Leser benötigten Module.

Initialisierung des RFID-Lesers:

reader = SimpleMFRC522()

Auslesen der RFID-Karten-ID:

try:
    id, text = reader.read()
    voter_id = str(id)
    candidate = request.form['candidate']

    if voter_id in voters:
        return "Voter has already voted"

    voters[voter_id] = candidate
    votes[candidate] += 1

    return redirect(url_for('index'))
finally:
    GPIO.cleanup()

Wir lesen die ID der RFID-Karte aus, wenn der Wähler abstimmt, und verwenden diese ID als eindeutige Kennung des Wählers. Die Methode GPIO.cleanup() dient dazu, die GPIO-Pins nach dem Lesen aufzuräumen.

Schlussfolgerung

Sie haben jetzt ein funktionsfähiges elektronisches Abstimmungssystem auf Basis von Raspberry Pi und Flask. Dieses Projekt lässt sich um zusätzliche Funktionen erweitern, etwa Multi-Faktor-Authentifizierung, die Speicherung der Stimmen in einer Datenbank und die Auswertung der Wahlergebnisse. Mit diesem Tutorial haben Sie eine solide Grundlage, um ein sicheres und zuverlässiges Abstimmungssystem zu entwickeln.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert