divya chandana
Published © GPL3+

MathGPT: A Fun Approach to Learning Math with Raspberry Pi

Transforming math learning for kids with an interactive game on Raspberry Pi, powered by ChatGPT. Engaging, adaptive, and fun math education

IntermediateFull instructions provided2 hours211
MathGPT: A Fun Approach to Learning Math with Raspberry Pi

Things used in this project

Hardware components

Raspberry Pi 4 Model B
Raspberry Pi 4 Model B
×1
LCD display I2C
From this sensor kit I have used LCD Display
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Traffic Light Module
From this Sensor Kit I have used Traffic Light Module
×1
Breadboard (generic)
Breadboard (generic)
×1

Software apps and online services

openai

Story

Read more

Schematics

hand drawn diagram

Code

math_gpt.py

Python
import drivers
from time import sleep
import RPi.GPIO as GPIO
from openai import OpenAI
import re
key = "YOUR KEY"

client = OpenAI(api_key=key)
scale = ['easy level', 'medium level', 'hard level', 'hardest level']
display = drivers.Lcd()

RED_PIN = 21
YELLOW_PIN = 16
GREEN_PIN = 12

GPIO.setmode(GPIO.BCM)
GPIO.setup(RED_PIN, GPIO.OUT)
GPIO.setup(YELLOW_PIN, GPIO.OUT)
GPIO.setup(GREEN_PIN, GPIO.OUT)

def light_on(pin):
    GPIO.output(pin, GPIO.HIGH)

def light_off(pin):
    GPIO.output(pin, GPIO.LOW)

def generate_math_question(level):
    
    prompt = f'Generate {scale[level]} Addition, Subtraction and Multiplication math questions with basic objects. Example questions include "1 apple + 1 apple" or "5 balls - 2 balls" or "5 balls * 2 balls". The questions should be straightforward and suitable for kids learning basic arithmetic operations.numbers should be below 100. Avoid complex scenarios and focus on simple, relatable objects to make the math game fun and engaging for children. Output each question as a string in the format "<number> <object> <operation> <number> <object>" and enclose them in a python list, such as ["3 pencils + 2 pencils","4 oranges - 1 orange","6 cookies * 3 cookies"].'
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": prompt},
        ],
        max_tokens=100,
        temperature=0.5
    )
    return response.choices[0].message.content.strip()

def check_answer(question, answer):
    try:
        return eval(question) == int(answer)
    except Exception as e:
        print("Error evaluating answer:", e)
        return False

def main():
    
    try:
        display.lcd_clear()       
        score = 0
        level = 1
        
        long_string("Welcome to Math GPT", 1)
        display.lcd_clear()
        display.lcd_display_string('Your Game starts',1)
        sleep(.5) 
        display.lcd_display_string('1',2)
        sleep(.5) 
        display.lcd_display_string('2',2)
        sleep(.5) 
        display.lcd_display_string('3',2)
        sleep(.5) 

        while True:
            
            questions_str = generate_math_question(level)
            try:
                questions = eval(questions_str)
            except Exception as e:
                print("Error parsing questions:", e)
            
            for question in questions:
                display.lcd_clear()
                print(question)
                question_string(question,1)
                display.lcd_display_string(question,1)
                while True:
                    display.lcd_display_string('   ',2) 
                    while True:
                        answer = input("Your Answer: ")
                        
                        if answer and answer.isdigit():
                            break
                    display.lcd_display_string(str(answer),2)    
                    question = re.sub(r'[^0-9\+\-x*]', '', question)
                    if check_answer(question, answer):
                        light_on(GREEN_PIN)
                        sleep(2)
                        light_off(GREEN_PIN)
                        display.lcd_clear() 
                        score+=10
                        
                        break
                    else:

                        light_on(RED_PIN)
                        sleep(1)
                        light_off(RED_PIN)
                         
            
            if level<3:
                level+=1
            display.lcd_clear()
            print('Level up!')
            display.lcd_display_string('Level up!', 1)
            print('Score:', str(score))
            display.lcd_display_string('Score '+ str(score), 2)
            light_on(YELLOW_PIN)
            sleep(2)
            light_off(YELLOW_PIN)
    except KeyboardInterrupt:
        print('Game stopped.')
        display.lcd_clear()
        GPIO.cleanup()
        

def long_string(text='', num_line=1, num_cols=16):
    if len(text) > num_cols:
        display.lcd_display_string(text[:num_cols], num_line)
        sleep(.5)
        for i in range(len(text) - num_cols + 1):
            text_to_print = text[i:i+num_cols]
            display.lcd_display_string(text_to_print, num_line)
            sleep(0.5)
    else:
        display.lcd_display_string(text, num_line)
        
def question_string(text='', num_line=1, num_cols=16):
    if len(text) > num_cols:
        display.lcd_display_string(text[:num_cols], num_line)
        for i in range(len(text) - num_cols + 1):
            text_to_print = text[i:i+num_cols]
            display.lcd_display_string(text_to_print, num_line)
            sleep(0.4)
    else:
        display.lcd_display_string(text, num_line)
        
if __name__ == "__main__":
    main()

Github file

Credits

divya chandana

divya chandana

4 projects • 5 followers
https://www.linkedin.com/in/divya-chandana-75b27438

Comments